好吧,我试图不要太具体,但实际上是这样:
public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DateTime startTeste = DateTime.Now;
DateTime finishTeste = startTeste.AddSeconds(mTeste + sTeste);
while(DateTime.Now <= finishTeste) //enquanto o teste nao terminar
{
if(backgroundWorker1.CancellationPending)
{
e.Cancel = true;
break;
}
backgroundWorker1.ReportProgress((int)(DateTime.Now - startTeste).TotalSeconds + 30);
//AtualizarVal();
Teste();
System.Threading.Thread.Sleep(30000);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
tProgress.Value = e.ProgressPercentage; //atualiza as barras de progresso
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled) //Caso seja cancelado o BGW
{
MessageBox.Show("Thread got canceled");
}
if(nTeste == nTestes)
{
buttonSTART.Enabled = true;
timer1.Stop();
MessageBox.Show("Job done");
}
}
函数Teste()是:
public void Teste()
{
tbtatual.Text = "12";
}
我唯一想做的就是每30秒写入一个文本框,而且我必须在一个线程中写入它,因为我要在更多的文本框中写入内容,并且要通过RS发送控件。 -232,由于这些控件和计时器的原因,我需要使用该线程,以便在我的程序通过RS-232发送和接收数据时不会弄乱我的计时器。
也许这是太多的代码,但是我认为通过这种方式,我会让您理解会发生什么。
答案 0 :(得分:0)
您无法从其他线程访问UI组件(文本框,MessegeBoxes等)。这些组件由UI线程示例控制;
public void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
{
//After some Work Done
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new
ThreadStart(delegate
{
Teste();
}));
}