在C#中终止正在运行消息循环的工作线程

4
我在一个工作线程中使用了SetWindowHookEx()Windows API,并通过使用Application.Run()来接收操作系统通知的应用程序消息泵。

现在,我想停止消息泵并退出工作线程,但我没有好的方法来终止线程。

另外,我使用Thread.Abort()方法来终止线程,但这不是优雅地终止线程的推荐方法。

有谁能够建议如何从UI线程或主窗体优雅关闭消息泵,以便工作线程自动返回并退出?

你能在BackgroundWorker中使用SupportsCancellation吗? - paparazzo
如果你是基于.NET4的,我建议看一下System.Threading.Tasks中的Task对象。它有一个取消令牌,可以用来中止操作。 - codechurn
1
你的应用程序是否同时运行了两个消息泵?如果是的话...那可能不太好。你应该尽量避免这样做,而是重复使用一个单一的泵。 - Servy
Thread.Abort()不再是以前可怕的“£@$”了。现在它会引发一个异常,可以用来优雅地释放任何锁定和资源。 - Immortal Blue
3个回答

4

使用可接受ApplicationContext的重载版本,而不是使用无参数的Application.Run

应用程序上下文具有ExitThread方法,可以优雅地结束消息循环。


好像我以相反的方式回答了? - Ken Kin

0

为什么不直接从另一个线程调用Application.Exit呢?


-2
如果你优雅地处理了工作线程中 Thread.Abort() 引起的 ThreadAbortException,那么终止线程就不会显得不优雅。

1
这是完全错误的。当你中止任意方法时,会发生很多非常糟糕的事情,包括未清理不受管理的资源,如果你调用的代码在长循环中捕获所有异常,则实际上不会中止等等。如果你只中止运行已查看过的固定代码集的线程,那么你可以确保不会发生任何问题,但这里并非如此,因为基本上可以将任何东西放入该消息泵中。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接