如何在主线程函数中使用BackgroundWorker?

时间:2019-05-27 12:29:03

标签: c# visual-studio

好吧,我试图不要太具体,但实际上是这样:

    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发送和接收数据时不会弄乱我的计时器。

也许这是太多的代码,但是我认为通过这种方式,我会让您理解会发生什么。

1 个答案:

答案 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();
       }));
}