[英]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
可以通過輸入啟動,本質上,如果用戶按下1
則bot1
任務將啟動:
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.