.NET:如何让后台线程信号主线程数据可用?

标签 .net multithreading asynchronous

ThreadAThreadB发出某些事件信号,而不让ThreadB阻塞等待事件发生的正确技术是什么?

我有一个后台线程将填充共享列表。我正在尝试找到一种方法来异步向“主”线程发出信号,表明有数据可供选取。

<小时/>

我考虑使用 EventWaitHandle 对象设置事件,但我不能让我的主线程位于 Event.WaitOne() 处。

<小时/>

我考虑过有一个委托(delegate)回调,但是 a)我不希望主线程在委托(delegate)中工作:线程需要返回工作以添加更多内容 - 我不希望它在委托(delegate)执行时等待,并且 b) 委托(delegate)需要编码到主线程,但我没有运行 UI,我没有控制权。调用委托(delegate)。

<小时/>

我考虑有一个委托(delegate)回调,它只是启动一个零间隔的System.Windows.Forms.Timer(线程访问同步的计时器)。这样线程只需要在调用时被卡住

Timer.Enabled = true;

但这看起来像是一个黑客。

在过去,我的对象会创建一个隐藏窗口,并让线程将消息发布到该隐藏窗口的 HWND。我考虑过创建一个隐藏控件,但我认为你不能。调用未创建句柄的控件。另外,我没有 UI:我的对象可能是在 Web 服务器、服务或控制台上创建的,我不希望出现图形控件 - 我也不想编译对 System.Windows 的依赖项。表格。

<小时/>

我考虑让我的对象公开 ISynchronizeInvoke 接口(interface),但随后我需要实现 .Invoke(),这就是我的问题。

<小时/>

让线程 A 向线程 B 发送某个事件的信号,而不让线程 B 阻塞等待事件发生的正确技术是什么?

最佳答案

下面是 System.ComponentModel.BackgroundWorker 类的代码示例。

    private static BackgroundWorker worker = new BackgroundWorker();
    static void Main(string[] args)
    {
        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;

        Console.WriteLine("Starting application.");
        worker.RunWorkerAsync();

        Console.ReadKey();
    }

    static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        Console.WriteLine("Progress.");
    }

    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        Console.WriteLine("Starting doing some work now.");

        for (int i = 0; i < 5; i++)
        {
            Thread.Sleep(1000);
            worker.ReportProgress(i);
        }
    }

    static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Console.WriteLine("Done now.");
    }

关于.NET:如何让后台线程信号主线程数据可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/122882/

相关文章:

c# - 如何使用c#从谷歌驱动器下载文件

.net - 将 python 模块导入 .net - "No module named signal"

c# - 从列表中选择到多个列表

c++ - Qt:将包含二维数组的信号从一个线程传递到另一个线程

javascript - 如何在 Angular 中制作异步函数?

javascript - 如何创建一个跟踪股票价格的 Javascript 对象?

javascript - jquery .done() 中的异步回调函数未执行

.net - 价格低于 300 美元的最佳 .NET Micro Framework 开发板是什么?

java - 为 ConcurrentHashMap 选择并发级别的最佳方法是什么?

c# - 是否有System.Threading.SynchronizationContext.Current.PostAsync()?