在多线程应用程序中使用backgroundworker

时间:2011-08-13 09:59:31

标签: c# .net multithreading backgroundworker

我的查询是关于BackgroundWorker

我有一个Windows窗体应用程序,它启动10个新线程。每个线程将从10个不同的Web服务获得一些信息。我只需要将Web服务调用的结果附加到设计模式下的富文本框中。在这种情况下如何使用后台线程?

ArrayList threadList;

for (int idx = 0; idx < 10; ++idx)
{
    Thread newth= new Thread(new ParameterizedThreadStart(CallWS));
    threadList.Add(newth);       
}


for (int idx = 0; idx < 10; ++idx)
{
    Thread newth= new Thread(new ParameterizedThreadStart(CallWS));
    newth.Start(something);          
}


for (int idx = 0; idx < 10; ++idx)
{
    //Cast form arraylist and join all threads.
}

private void CallWS(object param)
{
    // Calling WS
    // got the response.
    // what should I do to append this to rich text box using background worker.
}

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:1)

在工作线程中,您可以通过以下方式更新richtextbox:

private void CallWS(object param)
{
    string updatedText = ..

    // build a text    

    this.Invoke((MethodInvoker)delegate {
        // will be executed on UI thread
        richTextBox.Text = updatedText; 
    });
}

答案 1 :(得分:1)

我不确定在您的情况下使用BackgroundWorker是否是最佳解决方案。但是,如果您使用backgroundWorker,则可以对所有BackgroundWorkers使用相同的RunWorkerCompleted事件(在主线程上运行)。因此,您可以更新该事件的UI。

如果您正在寻找backgroundWorker的示例,请查看here

答案 2 :(得分:1)

我不太了解上下文,但我相信以下内容:

  1. 您正在使用Windows.Forms
  2. 您有多个主题
  3. 每个线程都想在UI线程中执行代码(附加文本)
  4. 因此解决方案不使用BackgroundWorker。相反,您应该使用BeginInvoke:http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.begininvoke.aspx

      

    RichTextBox.BeginInvoke方法

         

    在创建控件底层句柄的线程上异步执行委托。

    Hans Passantsllev's answer发表评论的问题可能是您因使用Invoke而出于某种原因阻止了UI线程。

    尝试用BeginInvoke替换Invoke。