返回首页

我有一个实例,在这里我想能够从后台线程来处理事件。具体来说,要能够处理由外部硬件产生的事件(通过串行端口的TCP / IP连接等),通过其数据的BackgroundWorker。

void Worker_DoWork(object sender, DoWorkEventArgs e)

{

    simpleButton3.Click += new EventHandler(simpleButton3_Click);

 

    while (!Worker.CancellationPending)

    {

        // Wait for event to be triggered

    }

 

    simpleButton3.Click -= new EventHandler(simpleButton3_Click);

}

 

void simpleButton3_Click(object sender, EventArgs e)

{

    // Do something...



    Thread.Sleep(5000);

 

    // Do something else...

}

然而,我在这个例子中发现,睡眠命令将主线程(GUI),BackgroundWorker的,而不是睡觉。

这是一个BackgroundWorker线程处理事件的可能吗?

谢谢!

回答

评论会员:游客 时间:2012/02/04
嗯,串行端口和TCP/IP连接,它并不难,如果你想做些什么,读/写数据从您的背景工人做大部分的处理和调用的ReportProgress结果。UI效率研究,你不要过于频繁的ReportProgress虽然。如果进展报告中的百分比,经常报告所取得的进展,只有当实际百分比变化,工作比较好,没有太多的开销。串口或TCP/IP的开幕和闭幕,您可以决定是否要在主(UI)线程或后台工作做。在我的应用程序,我已经做在主线程中。另外,如果你发送和接收,取决于你的应用程序,你可能会使用不同的背景工人,发送和接收数据。如果我的应用程序使用串行端口和另一个TCP/IP协议对一对,其中
SAKryukov
评论会员:游客 时间:2012/02/04
全部错了。为什么你认为你在你的后台线程的Click事件添加一个处理程序?这是没有意义的。你觉得如果你管理的一些事件的调用列表中添加一个处理程序,就会使事件本身在同一线程中调用这个方法呢?为什么呢?没办法!一般事件,委托实例和任何方法与线程无关。可以从任何线程中调用任何方法,但它的效果可能会有所不同,当然,特别是,这是会发生什么,当你调用任何UI相关的方法,或从非UI线程的属性。你根本无法做到这一点。相反,你需要使用该方法的Invoke或BeginInvokeSystem.Threading.Dispatcher(窗体或WPF)或System.Windows.Forms.Control的(形式)。在我过去的答案,你会发现它是如何工作的详细解释和代码样本:imgsrc=,{A1}见多线程也引用:{A2}{A3}]mdash;SA