0

我正在使用 mono 2.10.8.1 框架来开发一个小型 GUI 独立应用程序。

我创建了一个桌面 GUI 应用程序,其中我创建了一个线程,可用于在后台执行某些操作,然后在完成操作后中止调用线程。

另一件事是 Abort() 函数在 Windows 中运行良好,没有任何问题,但在 Linux 中无法运行。

Thread t1 = new Thread(Linux_Thread);
t1.IsBackground = true;
t1.Start();

//Do some operation in some other function.
Console.WriteLine("Linux thread :: " + t1.ThreadState);
t1.Abort();
Console.WriteLine("Linux thread After Abort :: " + t1.ThreadState);

因此,Linux 中上述程序的输出如下:

Linux thread :: Background
Linux thread After Abort :: Background, AbortRequested

而在 windows 中,上述程序的输出如下::

Linux thread :: Background
Linux thread After Abort :: Stopped

因此,似乎 Abort() 函数在单声道框架中不起作用,因为它在 Windows 平台中起作用。

之后,由于中止线程问题,我的应用程序以错误的方式运行,并且应用程序进入挂起状态。

有没有人知道这个问题或任何人遇到过这类问题?

三种关闭正在运行的线程的替代方法是什么?

请尽快让我知道答案。

4

1 回答 1

0

Thread.Abort 是邪恶的,建议尽量避免。

如果您真的确定没有其他方法可以实现您想要做的事情,请记住中止线程不一定是瞬时的 - 实际上它可能根本不会发生,这取决于您尝试的线程中止正在做。

MSDN 说:“线程不保证立即中止,或者根本不中止。”

尝试t1.Join ()在调用后添加一个t1.Abort ()- 如果它挂起,那么可能有问题。在这种情况下,您将需要所有线程的本机堆栈跟踪,以查看它为何挂起(获取您需要附加 gdb:gdb program <PID>然后执行 (inside gdb):的本机堆栈跟踪thread apply all backtrace

于 2013-09-25T07:26:36.147 回答