我有一个表单,在加载时启动一个循环后台工作程序,每隔半秒从USB设备获取一次数据。
一旦程序从USB设备接收到新的数据,它就会运行一个功能
_Dowork
函数有
while (true)
{
portConnection.Write("?");
Thread.Sleep(50);
}
然后我有一个单独的例程,在收到数据时运行
private void portConnection_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
}
这是不能在原始表单上设置值的例程,因为该函数显然位于单独的线程上 如何使这个例程能够影响原始形式?
答案 0 :(得分:3)
尝试这样的事情:
private void InvokeIfRequired(Control target, Delegate methodToInvoke)
{
if (target.InvokeRequired)
target.Invoke(methodToInvoke);
else
methodToInvoke.DynamicInvoke();
}
在ProcessStatsReceived
和methodToInvoke
做你的东西......
您可以在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 )
progressPercentage
和userState
可以是用户将数据从后台线程传输到GUI线程上的ProgressChanged
方法。