从单独的后台工作者更改表单

时间:2012-08-07 08:52:09

标签: c# multithreading serial-port

我有一个表单,在加载时启动一个循环后台工作程序,每隔半秒从USB设备获取一次数据。
一旦程序从USB设备接收到新的数据,它就会运行一个功能 _Dowork函数有

while (true)
{
    portConnection.Write("?");
    Thread.Sleep(50);
}

然后我有一个单独的例程,在收到数据时运行

private void portConnection_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
}

这是不能在原始表单上设置值的例程,因为该函数显然位于单独的线程上 如何使这个例程能够影响原始形式?

2 个答案:

答案 0 :(得分:3)

尝试这样的事情:

private void InvokeIfRequired(Control target, Delegate methodToInvoke)
{
    if (target.InvokeRequired)
        target.Invoke(methodToInvoke);
    else
        methodToInvoke.DynamicInvoke();
}

ProcessStatsReceivedmethodToInvoke做你的东西......

中调用方法

您可以在ProccessStatusReceived中使用它:

InvokeIfRequired(this, new MethodInvoker(delegate() { this.lblStatus.Text = (string)e.Data; }));

答案 1 :(得分:0)

BackgroundWorker的报告进度部分就是为此而做的。

这将使DoWork方法能够在GUI线程上调用方法。

有关详细信息,请参阅此msdn文章。

简而言之,所需的部分是:

绑定进度更改处理程序:

bw.ProgressChanged += bw_ProgressChanged;

设置BW以允许进度报告:

bw.WorkerReportsProgress = true;

实施进度变更方法:

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  //your logic to be executed on the GUI thread here
}

然后从DoWork中调用它:

bw.ReportProgress( progressPercentage, userState )

progressPercentageuserState可以是用户将数据从后台线程传输到GUI线程上的ProgressChanged方法。