gpt4 book ai didi

c# - 如何正确地并行运行多个异步任务?

转载 作者:太空狗 更新时间:2023-10-29 18:29:42 24 4
gpt4 key购买 nike

如果您需要并行运行多个异步 I/O 任务,但需要确保同时运行的 I/O 进程不超过 X 个,该怎么办;前后 I/O 处理任务不应该有这样的限制。

这是一个场景——假设有 1000 个任务;他们每个人都接受一个文本字符串作为输入参数;转换该文本(预 I/O 处理),然后将转换后的文本写入文件。目标是使预处理逻辑利用 100% 的 CPU/内核和任务的 I/O 部分以最大 10 的并行度运行(一次最多同时打开 10 个用于写入文件)。

您能否提供一个示例代码,说明如何使用 C#/.NET 4.5 完成此操作?

http://blogs.msdn.com/b/csharpfaq/archive/2012/01/23/using-async-for-file-access-alan-berman.aspx

最佳答案

我认为为此使用 TPL 数据流是个好主意:您创建具有无限并行性的预处理和后处理 block ,一个具有有限并行性的文件写入 block ,并将它们链接在一起。像这样的东西:

var unboundedParallelismOptions =
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded
};

var preProcessBlock = new TransformBlock<string, string>(
s => PreProcess(s), unboundedParallelismOptions);

var writeToFileBlock = new TransformBlock<string, string>(
async s =>
{
await WriteToFile(s);
return s;
},
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 });

var postProcessBlock = new ActionBlock<string>(
s => PostProcess(s), unboundedParallelismOptions);

var propagateCompletionOptions =
new DataflowLinkOptions { PropagateCompletion = true };

preProcessBlock.LinkTo(writeToFileBlock, propagateCompletionOptions);
writeToFileBlock.LinkTo(postProcessBlock, propagateCompletionOptions);

// use something like await preProcessBlock.SendAsync("text") here

preProcessBlock.Complete();
await postProcessBlock.Completion;

WriteToFile() 可能如下所示:

private static async Task WriteToFile(string s)
{
using (var writer = new StreamWriter(GetFileName()))
await writer.WriteAsync(s);
}

关于c# - 如何正确地并行运行多个异步任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10801328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com