Mur*_*ala 3 .net c# begininvoke winforms task-parallel-library
我需要让UI线程等待,直到任务数组完成执行.下面的代码的问题是 - 任务inturn调用UI线程写入文本框.如何解决这个问题?
public partial class FormConsole : Form
{
public FormConsole()
{
InitializeComponent();
}
void txtSayHello_Click(object sender, EventArgs e)
{
Class1 objclss = new Class1();
objclss.formConsole = this;
Task[] taa = new Task[4];
taa[0] = new Task(() => objclss.DoSomeThigs("Hello world"));
taa[1] = new Task(() => objclss.DoSomeThigs("Hello world1"));
taa[2] = new Task(() => objclss.DoSomeThigs("Hello world2"));
taa[3] = new Task(() => objclss.DoSomeThigs("Hello world3"));
foreach(Task task in taa)
{
task.Start();
}
Task.WhenAll(taa);
this.txtConsole.AppendText("All threads complete");
}
delegate void doStuffDelegate(string value);
public void doStuff(string value)
{
if (System.Windows.Forms.Form.ActiveForm.InvokeRequired && IsHandleCreated)
{
BeginInvoke(new doStuffDelegate(doStuff), value);
}
else
txtConsole.AppendText(value);
}
}
public class Class1
{
public FormConsole formConsole;
public void DoSomeThigs(string sampleText)
{
formConsole.doStuff(sampleText);
}
}
Run Code Online (Sandbox Code Playgroud)
o/p现在: Console Redirection TestAll threads completeHello worldHello world1Hello world2Hello world3
我希望: Console Redirection TestHello worldHello world1Hello world2Hello world3All threads complete
解决方案是什么?
Task.WhenAll返回完成传递给它的所有任务完成的任务.您必须执行await此任务,否则该方法将继续执行.
async void txtSayHello_Click(object sender, EventArgs e)
{
...
await Task.WhenAll(taa);
...
}
Run Code Online (Sandbox Code Playgroud)
这个方法有一个阻止版本 - Task.WaitAll.它将阻止当前线程,直到完成所有任务,但阻止UI线程不是一个好主意.
此外,在线程池线程上启动任务的首选方法是使用Task.Run.
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |