我有一种情况,我想要一个线程来处理一些顺序逻辑。该线程有时需要与主线程交互以更新用户输入。但它应该继续运行,而不会打扰主线程。我正在以事件驱动的方式跳转,以便主线程不必将另一个线程用于中断。做这个的最好方式是什么?是否存在事件驱动的技术来在线程之间进行通信,就像在MFC中一样?
我正在使用Visual Studio 2008和(显然).Net 3.5框架。
答案 0 :(得分:1)
AutoResetEvent and ManualResetEvent可能就是你所追求的。基本上,您的主线程将使用这些类的各种Wait方法等待,直到您使用Set方法从其他线程发出信号。然后你的wating线程将恢复并继续任何等待的东西。 这与事件风格一样好。你必须等待并听取对事件的反应。如果你优雅地举办活动,你还应该如何阻止你的线程工作?对于任何语言的一般线程,这是不可能的。
您唯一的另一种可能性是经常中断和轮询。
答案 1 :(得分:1)
使用BackgroundWorker
组件。
Here您可以找到有关C#中线程的最佳和完整的教程,包括代码示例和示例。
答案 2 :(得分:1)
查看.Net Reactive Extensions IObservable,特别是SubscribeOn和ObserveOn扩展方法。
ObserveOn是完成工作的地方(您的后台线程),SubscribeOn是通知的位置(您的UI线程)。
答案 3 :(得分:0)
如果您使用的是BackgroundWorker,则可以举起Progress事件 关于如何更新进度条的Here's an example。
答案 4 :(得分:0)
Dispatcher
。我只是让旋转线程访问主线程的CurrentDispatcher
我让线程旋转,当需要注意时,它调用Dispatcher
上的委托并等待主线程中断它。我知道我可以使用Invoke
而不是BeginInvoke
,但我需要使用中断,因为重新启动工作线程的方法不是调度委托堆栈的同步部分。
无论好坏,这是我的代码:
private void Run()
{
while (true)
{
...
// Need attention from the main thread
// "_main" is the main thread's Dispatcher instance.
_main.BeginInvoke(new MyEventHandler(OnNeedsAttention), this, new MyEventArgs(...));
try
{
Thread.Sleep(Timeout.Infinite);
}
catch (ThreadInterruptedException) { }
}
}