我的查询是关于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.
}
任何帮助都非常感激。
答案 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)
我不太了解上下文,但我相信以下内容:
因此解决方案不使用BackgroundWorker。相反,您应该使用BeginInvoke:http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.begininvoke.aspx
RichTextBox.BeginInvoke方法
在创建控件底层句柄的线程上异步执行委托。
您Hans Passant对sllev's answer发表评论的问题可能是您因使用Invoke而出于某种原因阻止了UI线程。
尝试用BeginInvoke替换Invoke。