簡體   English   中英

無法等待異步任務

[英]Cannot await async task

我有一個名為StartAsync的方法,它正在等待其他任務,這是設計:

public async Task StartAsync(int instance)
{
    await SomeController.Foo();
    await AnotherController.Foo2();
}

現在,我需要多次運行StartAsync方法,因此我創建了不同的Task ,這樣我就可以管理StartAsync Task的單個執行:

Task bot1 = new Task(async () => { await new Bot().StartAsync(1); });

Task bot2 = new Task(async () => { await new Bot().StartAsync(2); });

這些Tasks可以通過輸入啟動,本質上,如果用戶按下1bot1任務將啟動:

public async Task<bool> StartBotInstanceAsync(int instance)
{
     try  
     {
          switch(instance)
          {
              case 1:
                  await bot1.Start(); //<- Problem here
                  break;

              case 2:
                  bot2.Start(); 
                  break;
          }

          return true;
     }
     catch(Exception ex)
     {
         Logger.Info(ex.ToString());
         return false;
     }
}

本質上,當try catch塊中發生異常時,我需要寫一個日志,但是為此,我需要等待Task結果,不幸的是我得到了這個錯誤:

無法等待無效

await bot1.Start();

在這種情況下如何處理異常?

如果您希望使用當前結構進行操作,則需要2條單獨的語句。

case 1:
    bot1.Start();
    await bot1;
    break;

如果要使用多個機器人實例,請將它們存儲在數組中,並使用instance參數作為索引,例如:

_bots=new[]{ new Bot(),new Bot()};

public async Task<bool> StartBotInstanceAsync(int instance)
{
     try  
     {
          await _bots[instance-1].StartAsync();
          return true;
     }
     catch(Exception ex)
     {
         Logger.Info(ex.ToString());
         return false;
     }
}

甚至更好:

public async Task<bool> StartBotInstanceAsync(Bot bot)
{
     try  
     {
          await bot.StartAsync();
          return true;
     }
     catch(Exception ex)
     {
         Logger.Info(ex.ToString());
         return false;
     }
}

var myBot=_bots[instance-1];
var started=await StartBotInstanceAsync(myBot);

通過使用以bot作為參數的async函數,可以輕松創建更復雜的流,例如:

public async Task SomeComplexFlow(Bot bot)
{
    try
    {
        await bot.StartAsync();
        await bot.DoSomething();
        ...
    }
    catch(Exception exc)
    {
        ...
    }
}


var myBot=_bots[instance-1];
await SomeComplexFlow(myBot);

也可以等待多個任務完成。 一種方法是使用Task.WhenAll等待所有漫游器終止,例如:

await Task.WhenAll(_bots[0].StopAsync()...);

或者,更好的是:

var tasks=_bots.Select(bot=>bot.StopAsync());
await Tasks.WhenAll(tasks);

暫無
暫無

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

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