C#.net 4.5异步委托

时间:2012-05-22 19:50:29

标签: c# asynchronous task c#-5.0 asp.net-4.5

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

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

Action<object> myAnonActionDelegate = DoSomething;

DoSomething”不应该具有Func<object,Task>类型的签名而不是“行动”吗?实际上,“DoSomething”不能分配给Func<object,Task>代理。

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

1 个答案:

答案 0 :(得分:6)

  

“DoSomething”不应该有#{1}}类型的签名而不是Action吗?

不 - 该方法不会返回任何内容。查看声明 - 它是Func<object,Task>,而不是voidTask部分只是为了编译器的好处(以及人类阅读它) - 它实际上并不是方法签名的一部分。异步方法必须返回asyncvoidTask - 但方法的返回类型 正是您声明的那个。编译器不会将您的Task<T>神奇地变为void

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

Task

此时需要使用public async Task DoSomething(object arg){ ... } - 但这是一种不同的方法声明。

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