【问题标题】:Sending Events to a specific Thread将事件发送到特定线程
【发布时间】:2010-11-09 15:34:42
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf multithreading events delegates


    【解决方案1】:

    使用BackgroundWorker 组件。

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

    【讨论】:

    • BackgroundWorker 只支持进度事件,不是吗?我有大量不同的事件,我宁愿不通过进度值来调度它们;或类似的东西。这太过分了。我正在寻找更规范的答案。
    【解决方案2】:

    AutoResetEvent and ManualResetEvent 可能就是您所追求的。基本上,您的主线程将使用这些类的各种Wait 方法等待,直到您使用Set 方法从其他线程发出信号。然后你的等待线程将恢复并继续等待之后发生的任何事情。 这与事件风格一样好。您必须等待并聆听才能收到对事件的反应。如果您优雅地收到事件,您还应该如何停止线程工作?这对于任何语言的一般线程都是不可能的。

    您唯一的另一种可能性是频繁打断和轮询。

    【讨论】:

    • 你让我一直等到主线程等待。这不符合我的要求。我需要两者独立运行,直到第二个线程需要交互。
    【解决方案3】:

    看看 .Net Reactive Extensions IObservable,尤其是 SubscribeOn 和 ObserveOn 扩展方法。

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

    【讨论】:

    • 这是在哪个程序集/命名空间中?
    • 反应式扩展框架程序集。 Google 将帮助您找到包含各种下载等的确切页面。
    【解决方案4】:

    如果您使用的是 BackgroundWorker,则可以引发 Progress 事件。
    Here's an example 了解如何更新进度条。

    【讨论】:

    • 我知道如何使用BackgroundWorker。不符合我的要求。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多