2012-05-22 292 views
4

这不会抛出编译错误,但为什么呢?C#.NET 4.5异步委托

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

Action<object> myAnonActionDelegate = DoSomething; 

不应该“DoSomething”有Func<object,Task>类型的签名,而不是行动?其实“DoSomething”没有可分配给Func<object,Task>委托。

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

回答

6

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

否 - 该方法不返回任何东西。看看声明 - 这是void,而不是Taskasync部分仅仅是为了编译器的好处(以及人类阅读它) - 它不是方法签名的真正部分。异步方法必须返回voidTaskTask<T> - 但该方法的返回类型真的声明正是它的人。编译器不会神奇地将您的void变成Task

现在你可以完全相同的方法体,并声明该方法为:

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

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

我会强烈建议你使用形式返回Task除非你使用异步方法来订阅事件 - 你可能也允许呼叫者观察你的方法的进步,失败等

+0

无它应该返回一个IAsynchResult或者一个Task,我不知道哪个是哪个,但是它需要编译成指示这个方法是异步方法的东西。 – Alwyn

+0

明白了!谢谢乔恩。我想我希望和认为异步会自动包装返回类型内的任务。 – Alwyn

+1

@Alwyn,'async'方法不能返回'IAsyncResult',它总是返回'void','Task'或'任务'。 – svick