等待多个任务
Awaiting Multiple Tasks
我有以下代码:
private async void buttonStart_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
Bot b = new Bot(_names);
var result = await b.Start(false, true, false);
MessageBox.Show("Done");
}
public async Task<bool> Start(bool instagram, bool twitter, bool xbox)
{
if (twitter)
{
Twitter t = new Twitter(Names);
await t.CheckNames();
}
return true;
}
public Task CheckNames()
{
List<Task> tasks = new List<Task>();
foreach (Name name in Names)
{
tasks.Add(Task.Factory.StartNew(async () =>
{
TwitterResponse result = await Check(name);
MessageBox.Show(result.msg);
}));
}
return Task.WhenAll(tasks);
}
public async Task<TwitterResponse> Check(Name name)
{
HttpClient http = new HttpClient();
HttpResponseMessage response = await http.GetAsync(string.Format("https://twitter.com/users/username_available?username={0}", name.Value));
string html = response.Content.ReadAsStringAsync().Result;
TwitterResponse result = new JavaScriptSerializer().Deserialize<TwitterResponse>(html);
return result;
}
但是,我似乎总是在完成任何任务之前得到 MessageBox
说 "Done"
。
我是不是做错了什么,我怎样才能确保在获得 messagebox
之前所有的任务都真正完成了?
问题是 tasks.Add(Task.Factory.StartNew(async () =>
、you should almost never be using Task.Factory.StartNew
行,而是使用 Task.Run(
.
StartNew
返回的对象是一个 Task<Task>
,这意味着它不等待内部任务完成。您必须在 StartNew
的输出上调用 .Unwrap()
,然后再将其添加到集合中,或者更好地使用 Task.Run(
tasks.Add(Task.Run(async () =>
{
TwitterResponse result = await Check(name);
MessageBox.Show(result.msg);
}));
它有一个接受 Func<Task>
的重载,并会为您解包内部任务。
我有以下代码:
private async void buttonStart_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
Bot b = new Bot(_names);
var result = await b.Start(false, true, false);
MessageBox.Show("Done");
}
public async Task<bool> Start(bool instagram, bool twitter, bool xbox)
{
if (twitter)
{
Twitter t = new Twitter(Names);
await t.CheckNames();
}
return true;
}
public Task CheckNames()
{
List<Task> tasks = new List<Task>();
foreach (Name name in Names)
{
tasks.Add(Task.Factory.StartNew(async () =>
{
TwitterResponse result = await Check(name);
MessageBox.Show(result.msg);
}));
}
return Task.WhenAll(tasks);
}
public async Task<TwitterResponse> Check(Name name)
{
HttpClient http = new HttpClient();
HttpResponseMessage response = await http.GetAsync(string.Format("https://twitter.com/users/username_available?username={0}", name.Value));
string html = response.Content.ReadAsStringAsync().Result;
TwitterResponse result = new JavaScriptSerializer().Deserialize<TwitterResponse>(html);
return result;
}
但是,我似乎总是在完成任何任务之前得到 MessageBox
说 "Done"
。
我是不是做错了什么,我怎样才能确保在获得 messagebox
之前所有的任务都真正完成了?
问题是 tasks.Add(Task.Factory.StartNew(async () =>
、you should almost never be using Task.Factory.StartNew
行,而是使用 Task.Run(
.
StartNew
返回的对象是一个 Task<Task>
,这意味着它不等待内部任务完成。您必须在 StartNew
的输出上调用 .Unwrap()
,然后再将其添加到集合中,或者更好地使用 Task.Run(
tasks.Add(Task.Run(async () =>
{
TwitterResponse result = await Check(name);
MessageBox.Show(result.msg);
}));
它有一个接受 Func<Task>
的重载,并会为您解包内部任务。