1

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

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

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

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

这是无法在原始表单上设置值的例程,因为该函数显然位于单独的线程上。
我怎样才能使这个例程能够影响原始形式?

4

2 回答 2

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; }));
于 2012-08-07T09:03:48.310 回答
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 )

progressPercentage并且userState可以让用户将数据从后台线程传输到ProgressChangedGUI 线程上的方法。

于 2012-08-07T08:55:29.263 回答