4

这不会引发编译错误,但为什么呢?

public async void DoSomething(object arg){ ... }

Action<object> myAnonActionDelegate = DoSomething;

“”不应该DoSomething有一个类型的签名Func<object,Task>而不是动作吗?事实上“ DoSomething”是不可分配给Func<object,Task>委托的。

问题是为什么?我对 async 关键字的理解是否关闭?

4

1 回答 1

6

“DoSomething”不应该有一个类型的签名Func<object,Task>而不是动作吗?

不 - 该方法不返回任何内容。看看声明 - 它是void,不是Task。该async部分只是为了编译器的利益(以及人类阅读它) - 它并不是方法签名的真正部分。异步方法必须返回void,TaskTask<T>- 但该方法的返回类型实际上就是您声明的类型。编译器不会把你void变成Task神奇的。

现在您可以编写完全相同的方法体并将该方法声明为:

public async Task DoSomething(object arg){ ... }

此时您需要使用Func<object, Task>- 但这是一个不同的方法声明。

我强烈建议您使用返回的表单,Task 除非您使用异步方法订阅事件 - 您不妨允许调用者观察您的方法的进度、失败等。

于 2012-05-22T19:57:56.743 回答