代码之家  ›  专栏  ›  技术社区  ›  Jordan

将事件发送到特定线程

  •  1
  • Jordan  · 技术社区  · 14 年前

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

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

    5 回复  |  直到 14 年前
        1
  •  1
  •   Liviu Mandras    14 年前

    使用 BackgroundWorker 组件。

    Here 您可以通过代码示例和示例找到关于C中线程的最佳完整教程。

        2
  •  1
  •   bitbonk    14 年前

    AutoResetEvent and ManualResetEvent 可能是你想要的。基本上,您的主线程将等待使用 Wait 这些类的方法,直到使用 Set 方法。然后你的供水线将恢复,并继续与任何未来的等待。 这是一个很好的事件风格。你 不得不 等待并倾听对事件的反应。你还应该如何停止你的线程工作,以防你得到一个事件优雅?这在任何语言的线程中都是不可能的。

    你唯一的其他可能就是频繁的打断和投票。

        3
  •  1
  •   Neal    14 年前

    请看一下.NET反应式扩展iobservable,特别是subscribeon和observeon扩展方法。

    observeon是完成工作的地方(您的后台线程),subscribeon是通知的地方(您的UI线程)。

        4
  •  0
  •   the_drow    14 年前

    如果使用BackgroundWorker,则可以引发进度事件。
    Here's an example 关于如何更新进度条。

        5
  •  0
  •   Jordan    14 年前

    啊哈!有一种事件驱动的方式来实现它。我借了 Dispatcher 来自WPF。我只是让纺线进入主线 CurrentDispatcher 我让线程旋转,当它需要注意时,它调用 调度员 然后睡觉,等待主线程中断它。我知道我可以用 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) { }
        }
    }