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

C# 终止在C中运行消息循环的工作线程#,c#,.net,windows,winforms,C#,.net,Windows,Winforms,我在工作线程中使用了SetWindowHookEx()Windows API,并通过使用Application.run()运行应用程序消息泵来接收操作系统通知 现在,我想停止消息泵并退出工作线程,但我没有终止线程的好方法 或者,我使用Thread.Abort()方法来终止线程,但不建议使用这种方法来优雅地终止线程 有人能建议如何优雅地关闭UI线程或主窗体的消息泵,以便工作线程自动返回并退出吗?如果您优雅地处理thread.Abort()将在工作线程中导致的ThreadAbortException

我在工作线程中使用了
SetWindowHookEx()
Windows API,并通过使用
Application.run()
运行应用程序消息泵来接收操作系统通知

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

或者,我使用
Thread.Abort()
方法来终止线程,但不建议使用这种方法来优雅地终止线程


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

如果您优雅地处理thread.Abort()将在工作线程中导致的ThreadAbortException,中止线程没有什么不愉快的。

而不是使用无参数的
应用程序。运行
使用接受
应用程序上下文的重载


应用程序上下文有一个
ExitThread
方法,该方法将优雅地结束消息循环。

为什么不直接调用应用程序。从另一个线程退出?

能否使用BackgroundWorker和SupportsCancellation?如果您基于.NET4,我建议查看System.Threading.Tasks中的任务对象。它有一个取消令牌,您可以使用它中止操作。您的应用程序是否同时运行两个消息泵?如果是的话……那可能很糟糕。首先,您应该尽量避免这样做,并重复使用单个泵。Thread.Abort()不再是一个可怕的问题“过去是英镑。它现在引发了一个异常,可以根据需要优雅地释放任何锁和资源,而不是停止某个死机。这是错误的。当您中止任意方法时,可能会发生很多非常糟糕的事情,从未清理非托管资源,到在长循环中调用的代码捕获所有异常时实际上不会中止,等等。如果你只是中止一个线程运行一组你已经看过的固定代码,你可以确定这些都不会发生,但这里不是这样,因为基本上任何东西都可以放在消息泵中。我的回答似乎是相反的?