som*_*one 2 c# task async-await
我是异步编程的新手.我很想知道这些任务是否可以同时运行.考虑我有这个代码:
public async Task<IList<WebData>> GetAllAsync()
{
var twitterData = await ProvidetwitterDataAsync();
var facebookData = await ProvidefacebookDataAsync();
var linkedinData = await ProvidelinkedinDataAsync();
return twitterData .Concat(facebookData ).Concat(linkedinData ).ToList();
}
Run Code Online (Sandbox Code Playgroud)
我想因为我用过await twitterData那个Task应该完成,然后下一个Task将开始,因为我想连续这三个列表的结果我用这种方式编写它,我想知道有没有办法可以同时完成这三个任务?这种实施方式是正确的还是有更好的方法?
像这样的事情应该有效。
public async Task<IList<WebData>> GetAllAsync()
{
var twitter = ProvidetwitterDataAsync();
var facebook = ProvidefacebookDataAsync();
var linkedin = ProvidelinkedinDataAsync();
return (await Task.WhenAll(twitter, facebook, linkedin)).SelectMany(d => d).ToList();
}
Run Code Online (Sandbox Code Playgroud)
这 3 个任务可以同时运行,然后您等待所有任务,将它们的结果合并到一个列表中并返回它。
我是异步编程的新手.
那么我们要小心并仔细描述实际发生的事情.
我很想知道这些任务是否可以同时运行.
不要将任务视为同时运行,因为这意味着并发模型可能会或可能不会成立.您对任务的所有了解都是异步完成的.
想想这样:如果你有一些任务,比如"支付我的账单"和"割草坪","吃午饭",你可以支付一半的账单,然后开始修剪草坪,然后在修剪草坪的中途停下来,吃一些午餐,多付几张账单,然后完成修剪草坪.你以异步方式完成了这三个任务,但从未同时完成这三个任务.在吃午餐的同时,你从不修剪草坪.有时,异步任务确实与其他任务同时运行,但并非总是如此,因此不要将任务视为始终并发运行.
我认为因为我用了等待twitterData应该完成,之后将开始下一个任务,
正确.关键的见解是等待暂停异步工作流,直到任务完成.等待确实不拨打电话异步的.调用返回的任务已经是异步工作流程.等待只是意味着"如果这个任务没有完成,那就找一些别的事做,然后在完成时回到这里".
那么:你如何编写你的工作流程,以便你没有序列化任务?在任务开始后你就等了.编写代码的正确方法是:
public async Task<IList<WebData>> GetAllAsync()
{
var twitter = ProvideTwitterDataAsync();
var facebook = ProvideFacebookDataAsync();
var linkedin = ProvideLinkedinDataAsync();
var twitterData = await twitter;
var facebookData = await facebook;
var linkedinData = await linkedin;
return twitterData .Concat(facebookData ).Concat(linkedinData ).ToList();
}
Run Code Online (Sandbox Code Playgroud)
现在这三个任务是异步启动的,然后我们暂停工作流直到完成所有三个任务,然后我们连接结果.
| 归档时间: |
|
| 查看次数: |
708 次 |
| 最近记录: |