C#.net 4.5异步委托

Alw*_*wyn 4 c# asynchronous task c#-5.0 asp.net-4.5

这不会抛出编译错误,但为什么呢?

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

Action<object> myAnonActionDelegate = DoSomething;
Run Code Online (Sandbox Code Playgroud)

不应该" DoSomething"有一个类型的签名Func<object,Task>而不是Action?事实上," DoSomething"不能转让给Func<object,Task>代表.

问题是为什么?我对async关键字的了解是什么?

Jon*_*eet 6

难道"DoSomething"不具有类型的签名Func<object,Task>而不是Action吗?

不 - 该方法不返回任何内容.看看声明 - 它void不是Task.这async部分只是为了编译器的好处(以及人类阅读它) - 它并不是该方法签名的一部分.异步方法必须返回void,Task或者Task<T>-但该方法的返回类型真的只是声明它是.编译器不会让你void变得Task神奇.

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

public async Task DoSomething(object arg){ ... }
Run Code Online (Sandbox Code Playgroud)

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

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