【问题标题】:Thread.Abort() function is not working in mono frameworkThread.Abort() 函数在单声道框架中不起作用
【发布时间】:2013-09-25 06:54:21
【问题描述】:

我正在使用 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 平台上工作。

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

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

有没有三种方法可以关闭正在运行的线程?

请尽快告诉我答案。

【问题讨论】:

  • mono 2.10 已经老了,请用 mono 3.2.x 测试
  • @knocte :: 我正在使用 ubuntu 12.04,我在“go-mono.com/mono-downloads/download.html”网站上看到 mono 3.2.X 适用于 MAC OS、Windows 和 Open Suse,不适用于其他。你知道他们支持 3.2.X 吗?
  • @knocte,你能告诉我除了 Open Suse 之外的其他 Linux 平台支持 mono 3.2.X 吗?
  • 如果你的发行版没有提供mono 3.2.x的包,你可以自己编译mono

标签: .net linux multithreading mono window


【解决方案1】:

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

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

MSDN says: "线程不保证立即中止,或者根本不中止。"

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

【讨论】:

  • 我已经按照您的说法尝试了通过 abort 和 join 的方式,但结果是 GUI 在使用这种方式后进入挂起状态..
  • so,看来 join 不是解决这个问题的正确方法。
  • 如果在使用 Join 时挂起,请按照我的解释使用 gdb 获取堆栈跟踪。
  • 如果我注释掉 Abort() 函数是否会导致任何问题,因为我观察到 Linux 将自行管理并在该线程完成时退出正在运行的线程。
  • 我在代码中使用的任何地方都注释掉了 t1.Abort() 行,并使用一些可能的测试用例运行该代码,这些测试用例运行良好,没有任何与内存相关的问题或其他问题每当我使用 Abort() 函数时都遇到过。这个过程是否会导致任何内存问题以及 Linux 端的其他一些问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多