当前位置:  开发笔记 > 运维 > 正文

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

如何解决《.NET:如何使用后台线程信号主线程数据?》经验,为你挑选了1个好方法。

ThreadA信号ThreadB的某些事件的正确技巧是什么,没有让ThreadB等待事件发生?

我有一个后台线程,将填充共享List .我正试图找到一种方法来异步发信号通知"主"线程有可用的数据被拾取.


我考虑使用EventWaitHandle对象设置一个事件,但我不能让我的主线程坐在Event.WaitOne()上.


我考虑过委托回调,但是a)我不希望主线程在委托中工作:线程需要重新开始工作添加更多东西 - 我不希望它在委托执行时等待,并且b )委托需要被编组到主线程上,但我没有运行UI,我没有控制权.禁止委托.


我认为有一个委托回调,只需启动零间隔System.Windows.Forms.Timer(同步线程访问定时器).这样线程只需要在调用时卡住

Timer.Enabled = true;

但这似乎是一个黑客.

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


我考虑让我的对象公开一个ISynchronizeInvoke接口,但后来我需要实现.Invoke(),这是我的问题.


某些事件的线程A信号线程B的正确技术是什么,没有让线程B被阻塞等待事件发生?



1> herbrandson..:

这是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.");
    }

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有