【问题标题】:C# .net 4.5 async delegateC# .net 4.5 异步委托
【发布时间】:2012-05-29 08:42:15
【问题描述】:

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

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

Action<object> myAnonActionDelegate = DoSomething;

DoSomething”不应该有一个Func&lt;object,Task&gt;类型的签名而不是Action吗?事实上“DoSomething”不能分配给Func&lt;object,Task&gt;委托。

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

【问题讨论】:

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


    【解决方案1】:

    “DoSomething”不应该有Func&lt;object,Task&gt;类型的签名而不是Action吗?

    否 - 该方法不返回任何内容。查看声明 - 它是 void,而不是 Taskasync 部分只是为了编译器的利益(以及人类阅读它) - 它并不是方法签名的真正部分。异步方法必须返回 voidTaskTask&lt;T&gt; - 但方法的返回类型确实 正是您声明的。编译器不会神奇地将你的void 变成Task

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

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

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

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

    【讨论】:

    • 不,它应该返回一个 IAsynchResult 或一个任务,我不知道哪个是哪个,但它必须编译成表明该方法是异步方法的东西。
    • 知道了!谢谢乔恩。我想我希望并认为 async 会自动将返回类型包装在任务中。
    • @Alwyn, async 方法不能返回IAsyncResult,它总是必须返回void, TaskTask&lt;T&gt;
    • @svick 是的,这是我的误解。现在一切都尘埃落定了。
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多