我有一个名为StartAsync
的方法正在等待不同的任务,这就是设计:
public async Task StartAsync(int instance)
{
await SomeController.Foo();
await AnotherController.Foo2();
}
现在我需要多次运行StartAsync
方法,因此我创建了不同的Task
,这样我就可以管理{{1}的Task
的单个执行}:
StartAsync
这些Task bot1 = new Task(async () => { await new Bot().StartAsync(1); });
Task bot2 = new Task(async () => { await new Bot().StartAsync(2); });
可以通过输入启动,本质上,如果用户按下Tasks
,则1
任务将启动:
bot1
基本上,当try catch块中发生异常时,我需要写一个日志,但是为此,我需要等待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;
}
}
结果,不幸的是我得到了这个错误:
无法等待作废
在Task
在这种情况下如何处理异常?
答案 0 :(得分:0)
如果您希望使用当前结构进行操作,则需要2条单独的语句。
case 1:
bot1.Start();
await bot1;
break;
答案 1 :(得分:0)
如果要使用多个机器人实例,请将它们存储在数组中,并使用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);
通过使用将机器人作为参数的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);