【问题标题】:Does this TPL idiom exist?这个 TPL 习语存在吗?
【发布时间】:2012-01-24 16:54:50
【问题描述】:

将 TPL 与 .NET 4 结合使用,我试图决定如何设计处理未来的 API。我想到的一种可能性是模仿异步模式但没有End(IAsyncResult) 方法:

public Task<int> BeginGetAge()
{
    // create and return task
}

public int GetAge()
{
    return this.BeginGetAge().Result;
}

因此,调用者可以决定是调用GetAge() 的阻塞版本还是非阻塞版本。此外,他们可以访问未来,因此可以在其之上构建延续等等。

这个成语有效吗?有没有我遗漏的明显缺点或问题?它甚至可能有正式名称吗?

【问题讨论】:

标签: c# .net-4.0 asynchronous task-parallel-library idioms


【解决方案1】:

返回 Task 是新的 C#5 异步方式 - 它称为 TAP:Task-based Asynchronous Pattern

唯一的区别是方法名为GetAgeAsync

所以,是的 - 推荐使用这种方法,因为它可以在发布时轻松移植到 C#5 异步。

【讨论】:

    【解决方案2】:

    这个习语对我来说似乎完全有效,并且确实支持基于Task 的异步将是即将到来的.Net 版本中的一个重要功能。

    但是,我会更改您的实现,因此阻塞方法 GetAge 不会调用异步方法然后等待它 - (可能)创建新线程的开销是不必要的。

    【讨论】:

    • 可以交换方法之间的关系,让BeginGetAge()返回Task&lt;int&gt;.Factory.StartNew(() =&gt; GetAge())
    • 好吧,我认为它不会创建一个新线程,而是将上下文切换到现有线程。即便如此,由调度程序决定是否有必要这样做。但我同意你的观点,肖恩的建议是有道理的。
    猜你喜欢
    • 2014-10-09
    • 2017-07-03
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2015-09-06
    • 2017-08-21
    相关资源
    最近更新 更多