【问题标题】:Async generic delegate in C# 5.0C# 5.0 中的异步泛型委托
【发布时间】:2011-12-06 21:39:05
【问题描述】:

使用迭代器,以下通用委托是可能的:

public delegate IEnumerable<TOut> MyDelegate<TIn>(TIn param1);

使用 C# 5.0 CTP 中的新 async/await,我希望能够创建类似的委托,如下所示:

public delegate async TOut MyDelegate<TIn>(TIn param1);

我找不到 C# 5.0 规范或这方面的任何帮助。有谁知道这是怎么写的,或者如果不能写,为什么?

谢谢!

【问题讨论】:

    标签: async-ctp c#-5.0


    【解决方案1】:

    async 是实现细节,而不是接口规范。 async 委托没有意义。

    任何返回“awaitable”的方法(例如TaskTask&lt;T&gt;)都可以与await 一起使用。

    因此,“异步委托”可以是任何返回 TaskTask&lt;T&gt;(或任何其他类型的可等待)的委托类型。在你的情况下:

    public delegate Task<TOut> MyDelegate<TIn, TOut>(TIn param1);
    

    【讨论】:

    • 好的,我认为 Task 类似于 IEnumerable。我想我只是对 Task 不是接口而不是类感到惊讶。我现在可以在the documentation 中找到它。谢谢!
    • 一个界面会很好(特别是它允许变化),但它也有一些缺点。 await 关键字现在使用模式匹配,而不是依赖于 Task 类型。这允许其他可等待对象,例如 Windows 8 中的 WinRT 异步操作,它们可能是纯粹的非托管代码。如果有托管接口ITask&lt;T&gt;,那么非托管代码就得实现托管接口,比较乱。
    • @uosɐſ 另请注意,您可以类似地在任何类型上使用 foreach 并使用 GetEnumerator 方法,该方法又返回具有布尔返回 MoveNext 方法和 Current 属性的类型。换句话说,就像 foreach 不依赖于 IEnumerable 一样,await 也不依赖于任何特定的类型。
    • @StephenCleary 这通常被称为鸭子类型而不是模式匹配。
    • 好吧,这个讨论促使我创建了一个 ITask 实现。它的用法还不错:github.com/jam40jeff/ITask
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多