将事件发送到特定线程

时间:2010-11-09 15:34:42

标签: c# wpf multithreading events delegates

我有一种情况,我想要一个线程来处理一些顺序逻辑。该线程有时需要与主线程交互以更新用户输入。但它应该继续运行,而不会打扰主线程。我正在以事件驱动的方式跳转,以便主线程不必将另一个线程用于中断。做这个的最好方式是什么?是否存在事件驱动的技术来在线程之间进行通信,就像在MFC中一样?

我正在使用Visual Studio 2008和(显然).Net 3.5框架。

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)

啊哈哈!有一种事件驱动的方式来做到这一点。我从WPF借了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) { }
    }
}