【问题标题】:Async - Which of these is correct异步 - 哪些是正确的
【发布时间】:2016-11-11 22:28:33
【问题描述】:

从以下 2 个场景中,哪一个是在 c# 中进行异步编程的正确方法?

场景一

public async Task<T1> AddSomethingAsync(param)
{
    return await SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}

然后

List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
    Tasks.Add(AddSomethingAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());

场景 2

public async Task<T1> AddSomethingAsync(param)
{
    return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}

然后

List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
    Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());

2 之间的唯一区别是,稍后在 AddSomethingAsync 函数中没有 await 关键字。

所以这里是更新 - 我想知道要实现的是,所有任务都应该并行和异步执行。 (我的想法是在场景 1 中,调用将在 AddSomethingAsync 中等待,并且会在上层阻塞下一个循环执行时受到伤害。确认

【问题讨论】:

  • Tasks.AsParallel?我想你不知道AsParallel 做了什么。只需使用await Task.WhenAll(Tasks);。即使您的函数不是真正异步的,AsParallel 也为时已晚。
  • @Luaan,你能分享更多关于“迟到”的想法吗?
  • 通过在可枚举对象上调用 AsParallel 并枚举它,您不会并行化任何东西。只有当您生成的数据是惰性的时,PLINQ 才能为您提供帮助 - 在您的情况下,所有工作都已经完成(调用 AddSomethingAsync)。

标签: c# .net c#-5.0


【解决方案1】:

场景 3

public Task<T1> AddSomethingAsync(param)
{
    return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}

然后

List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
    Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task));
}
await Task.WhenAll(Tasks);

如果你没有等待任何东西 - 你不需要 async 关键字。在这种情况下,执行 AsParallel 也无济于事。

【讨论】:

    【解决方案2】:

    在我看来是一样的。 await 是一个标记,表示这一行和这个方法在同一个线程中执行,它会在线程中等待。
    实际上asyncawait 是为方法返回无效而设计的。所以如果这个方法不返回结果,它可以单独放在一个线程中。此方法调用的任何async 方法意味着它将使用与void 方法相同的线程,如果这些子方法需要结果await,它会在此线程内等待。
    当你把它们放在List&lt;Task&gt; 中时,没有任何区别。

    【讨论】:

    • 当前方法返回一个对象但是没有用。
    • 你需要了解什么情况下应该使用async &amp; await。我写了一篇关于它的博客here,你可以直接跳转到Async&amp;await&amp;Task部分,不是英文的,但你可以查看实验结果或谷歌翻译。
    猜你喜欢
    • 2018-04-19
    • 2012-04-17
    • 2021-02-20
    • 2014-12-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多