无法等待异步任务

时间:2018-10-29 14:38:21

标签: c# exception task

我有一个名为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

在这种情况下如何处理异常?

2 个答案:

答案 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);