【发布时间】:2020-03-01 09:53:06
【问题描述】:
我对@987654321@ 有一个类似的问题,我希望从一个函数列表中并行运行多个函数。
我在网上的一些 cmets 中提到,如果您的方法中有另一个 await,Task.WhenAll() 将无济于事,因为 Async 方法不是并行的。
然后我继续为每个 using 函数调用创建了一个线程,如下所示(并行函数的数量通常很小,为 1 到 5 个):
public interface IChannel
{
Task SendAsync(IMessage message);
}
public class SendingChannelCollection
{
protected List<IChannel> _channels = new List<IChannel>();
/* snip methods to add channels to list etc */
public async Task SendAsync(IMessage message)
{
var tasks = SendAll(message);
await Task.WhenAll(tasks.AsParallel().Select(async task => await task));
}
private IEnumerable<Task> SendAll(IMessage message)
{
foreach (var channel in _channels)
yield return channel.SendAsync(message, qos);
}
}
我想仔细检查一下我没有做任何可怕的代码气味或错误,因为我正在掌握我从网上找到的东西拼凑而成的东西。非常感谢。
【问题讨论】:
-
如果你的方法中有另一个 await,Task.WhenAll() 将无济于事,因为 Async 方法不是并行的。 这种说法是错误的。如果异步方法受 CPU 限制,则它们可以是并行的,如果它们受 CPU 限制或 I/O 限制,则绝对可以是并发的。这取决于您如何开始,然后
await相关任务。如果您在创建后立即await每个任务:没有并发。如果你全部创建它们然后等待它们:并发。
标签: c# multithreading task-parallel-library