【问题标题】:Async CTP Task.WhenAll issue异步 CTP Task.WhenAll 问题
【发布时间】:2011-11-11 22:53:10
【问题描述】:

我被困在看似简单的事情上,但我看不出我做错了什么。我有一个简单的类结构“StaticQuote”,它描述了从我试图找到最小值的复杂计算返回的值。因为计算调用很昂贵,所以我创建了一个任务数组,因此计算并行执行,然后使用 Task.WhenAll 等待它们全部完成,然后再比较结果(存储在 StaticQuote 对象中)。问题是在尝试返回 StaticQuotes 数组时出现以下错误:

无法将类型 'System.Threading.Tasks.Task<Services.QuoteGeneratorAsync.StaticQuote[]>' 隐式转换为 'Services.QuoteGeneratorAsync.StaticQuote[]'

我看到过类似的字符串等示例,其中该分配完美地工作,所以无法理解哪个右侧没有返回一组 StaticQuote 结果?我是多线程代码和异步 CTP 的新手。谁能提供答案?非常感谢。

示例问题:

List<Task<StaticQuote>> Calculations = new List<Task<StaticQuote>>();
foreach()
{
Calculations.Add(TaskEx.RunEx(() => Calculate(...my params....)));                                             
}
StaticQuote[] Quotes=TaskEx.WhenAll<StaticQuote>(Calculations);  --//this line won't compile

【问题讨论】:

    标签: c#


    【解决方案1】:

    TaskEx.WhenAll 返回一个Task&lt;T[]&gt;,它指示所有其他任务何时完成。所以你想要:

    StaticQuote[] quotes = await TaskEx.WhenAll(Calculations);
    

    await 表达式将Task&lt;T&gt;“解包”为T。所以如果你有其他地方:

    Task<string> downloadTask = webClient.DownloadStringTaskAsync(url);
    string result = await downloadTask;
    

    完全相同 - 只是 WhenAll 版本稍微复杂一些,因为它有一个集合任务输入和输出,而不是单个。

    显然,要使用await,您必须首先使用async 方法。

    如果所有这些仍然令人困惑,您可能想阅读我的blog posts about async 和those of Eric Lippert。 (当然,还有很多其他可用的。)

    【讨论】:

    • 非常感谢乔恩 - 不会等待导致线程继续前进吗?我有一个顶层 for 循环,它再次调用整个事情,所以试图一次控制运行中的线程数。我看到了这个例子stackoverflow.com/questions/4174806/… 为什么他在这里做的任务对我不起作用?小马托尼怎么样? :)
    • @dustybin: await 将导致该方法返回给调用者,但是当所有任务完成后它会返回该方法。链接问题中的作业确实使用await,所以我不确定你的意思...
    • 是的,该示例使用了 await,但我担心如果线程继续运行,它将从我的外部循环中产生下一批计算线程。这应该不是问题,我只是想看看我是否可以控制线程数,因为 Calculate() 需要 3-5 秒才能返回。不想太多人同时跑。去年我参加了你关于 Async 的 DDD Modern .Net 日演讲(太棒了),但这是我不得不使用它的第一次机会。也刚刚意识到WhenAll 有一个“.Result”属性-doh。将阅读博客...干杯。
    • @dustybin:在所有任务完成之前,异步方法不会继续 - 这就是 await 的全部意义所在。 调用方法将能够继续,但那是另一回事:)
    • 外循环在我的调用方法中:)
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多