刚刚注意到奇怪的事情:要从新任务捕获调用者中的异常,lambda 必须标记为异步!?即使 delegate 根本没有await 运算符,这真的有必要吗?
try
{
//Task.Run(() => // exception is not caught!
Task.Run(async () => // unnecessary async!?!
{
throw new Exception("Exception in Task");
}).Wait();
}
catch (Exception ex)
{
res = ex.Message;
}
为什么需要异步运算符?
我能找到的所有文档都告诉我们委托不得返回 Void,并且必须等待任务将异常传播给调用者。
添加完整代码:
class Program
{
static void Main(string[] args)
{
var p = new Program();
p.Run();
}
public void Run()
{
string result;
try
{
result = OnSomeEvent((s, ea) => RunSomeTask());
}
catch (Exception ex) // Try to catch unhandled exceptions here!
{
result = ex.Message;
}
Console.WriteLine(result);
Console.ReadKey();
}
// Some other Framework bult-in event (can not change signature)
public string OnSomeEvent(EventHandler e)
{
e.Invoke(null, new EventArgs());
return "OK";
}
private async Task RunSomeTask()
{
await Task.Run(async () => // do not need async here!!!
//await Task.Run(() => // caller do not catches exceptions (but must)
{
throw new Exception("Exception in Task1");
});
}
}
所以问题是如何抓住前任。没有 async 关键字???
返回的方法Task
- 例如Task.Run
or async
方法 - 将在返回的方法上放置任何异常Task
。由您以某种方式观察该异常。通常这是通过以下方式完成的await
, 像这样:
await Task.Run(() => { throw ... });
就您而言,问题出在这一行:
result = OnSomeEvent((s, ea) => RunSomeTask());
在这段代码中,RunSomeTask
正在返回一个Task
, 然后Task
永远不会被等待。为了观察异常,您应该await
那个任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)