【发布时间】:2016-12-10 00:17:19
【问题描述】:
我现在想创建一些异步任务而不启动它们。 使用无类型任务没有问题:
private Task CreateTask() {
return new Task(
async () => await DoSomething().ConfigureAwait(false));
}
但是为了处理异常,我在函数中添加了一个返回值。但是我怎样才能用正确的语法写出来:
private Task<bool> CreateTask() {
return new Task<bool>(
async () => await DoSomething().ConfigureAwait(false));
}
我收到消息,异步 lambda 表达式无法转换为 func。 所以我的问题是:它是如何正确编写的?
【问题讨论】:
-
这两种方法都是错误的。
DoSomething()已经返回了一个正在运行的任务,所以你可以按原样返回它,return (Task)DoSomething();。await等待 已经运行的任务完成,它不会使其异步启动。没有理由使用new创建冷任务。在第二种情况下,应该是什么值? -
这听起来像是XY Problem 的情况。你对 X 有问题,认为 Y 是解决方案,当它不起作用时询问 Y。您要解决的实际问题是什么?
-
要处理异常,请使用异常处理程序将您的
await调用附上,就像使用同步方法一样。await将导致抛出原始异常。你可以写例如try{ .... await CallMyServerAsync();}catch(WebException exc){...},就像你写try{ .... await CallMyServer();}catch(WebException exc){...},如果CallMyServer是一个阻塞方法
标签: c# asynchronous async-await task