2012-08-07 72 views
1

我有一个表格,加载时启动一个循环后台工作器,每半秒钟从USB设备获取数据。
一旦程序收到来自USB设备的新数据,它就会运行一个函数。
_Dowork函数具有从一个单独的后台工作人员更改表格

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

我然后有当接收

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

该数据运行一个单独的例程是无法在原来的形式上然后设定值作为函数显然是常规在一个单独的线程。
我怎样才能使这个例程能够影响原始形式?

+4

看看'Invoke''''InvokeRequired' – 2012-08-07 08:52:44

+0

尝试类似 if(portCon nection.InvokeRequired) { portConnection.Write(“?”); } – Rajesh 2012-08-07 08:59:08

回答

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; })); 
+0

目标是我想要使用的主要形式还是单个对象? – 2012-08-07 09:15:30

+1

这是形式。我在回答中增加了一个例子 – Karl 2012-08-07 09:18:34

+0

完美地工作,因为数据在被转发到另一个函数之前进入一个函数我刚刚完成了上面的InvokeIfRequired(this,new MethodInvoker(delegate(){this.sensorLocationUpdated();})) ; – 2012-08-07 09:37:48

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可以是用户将数据从后台线程转移到ProgressChanged方法GUI线程上。