【发布时间】:2018-10-29 14:38:20
【问题描述】:
我有一个名为StartAsync 的方法等待不同的任务,这是设计:
public async Task StartAsync(int instance)
{
await SomeController.Foo();
await AnotherController.Foo2();
}
现在我需要多次运行StartAsync方法,所以我创建了不同的Task,这样我可以管理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任务就会启动:
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 结果,不幸的是我收到了这个错误:
不能等待 void
在await bot1.Start();
在这种情况下如何管理异常?
【问题讨论】:
-
Start!=StartAsync- 你的意思是写await bot1.StartAsync();? -
@Default
bot1.Start()是一个包含Task的await new Bot().StartAsync(1); -
您不需要需要冷任务来拨打多个电话。
await不启动任务,它等待一个已经在运行的任务。这意味着您可以将多次调用返回的任务存储到Bot.StartAsync并单独或一次等待它们,例如await Task.WhenAll(task1,task2); -
如果您能清楚地描述您要解决的问题,那将是一个开始。目前,您似乎只是在这个问题上抛出
await和Task并试图让它编译而没有明确的 spec 来实现您想要实现的目标(或者如果你有这样的规范,你还没有与我们分享) -
@JuveMerda 您不需要任何代码来捕获异常。你需要解释你实际上想要做什么。为什么不创建一个 simple 方法来创建一个新机器人并在
try/catch中等待任务?您是否要创建多个机器人实例,在这种情况下您需要一个Bot[]数组?