簡體   English   中英

等待多個任務

[英]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;
}

但是,在"Done"任何任務之前,我似乎總是讓MessageBox "Done"

我做錯什么了嗎,如何在獲得messagebox之前確保所有任務實際上已完成?

問題是上一行tasks.Add(Task.Factory.StartNew(async () =>您應該幾乎永遠不要使用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>並將為您解包內部任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM