C# 将事件发送到特定线程

C# 将事件发送到特定线程,c#,wpf,multithreading,events,delegates,C#,Wpf,Multithreading,Events,Delegates,在这种情况下,我需要一个线程来处理一些顺序逻辑。该线程有时需要与主线程交互,以便更新用户输入。但是它应该在不影响主线程的情况下继续运行。我希望以事件驱动的方式来实现这一点,这样主线程就不必为另一个线程的中断设置极点。最好的方法是什么?是否有一种事件驱动技术可以像MFC一样在线程之间进行通信 我使用的是Visual Studio 2008和(显然).Net 3.5框架。可能就是您想要的。基本上,您的主线程会等待使用这些类的各种方法,直到您从使用该方法的其他线程发出信号。然后,您的等待线程将恢复并继

在这种情况下,我需要一个线程来处理一些顺序逻辑。该线程有时需要与主线程交互,以便更新用户输入。但是它应该在不影响主线程的情况下继续运行。我希望以事件驱动的方式来实现这一点,这样主线程就不必为另一个线程的中断设置极点。最好的方法是什么?是否有一种事件驱动技术可以像MFC一样在线程之间进行通信

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

可能就是您想要的。基本上,您的主线程会等待使用这些类的各种方法,直到您从使用该方法的其他线程发出信号。然后,您的等待线程将恢复并继续等待之后的任何内容。 这与事件样式一样好。您必须等待并倾听,才能收到对事件的反应。如果您优雅地获得了一个事件,您还应该如何停止线程工作?这在任何语言的线程中都是不可能的

你唯一的另一种可能性就是频繁的打断和投票

使用组件


您可以找到关于C#中线程的最佳完整教程,以及代码示例和示例。

如果您使用BackgroundWorker,则可以引发进度事件。

关于如何更新进度条。

请查看.Net反应式扩展IObservable,特别是SubscribeOn和ObserveOn扩展方法


ObserveOn是完成工作的地方(你的后台线程),SubscribeOn是通知的地方(你的UI线程)。

啊哈!有一种事件驱动的方法可以做到这一点。我从WPF借了
调度器
。我只是让旋转线程访问主线程的
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) { }
    }
}

BackgroundWorker
只支持进度事件,不是吗?我有大量不同的事件,我不希望通过进度值发送它们;或者类似的。那太过分了。我在寻找一个更规范的答案。你让我一直等到主线程等待。那不符合我的要求。我需要两个线程独立运行,直到第二个线程需要交互。我知道如何使用
BackgroundWorker
。它不符合我的要求。这是什么程序集/命名空间?反应式扩展框架程序集。谷歌将帮助你找到各种下载等准确的网页。