gpt4 book ai didi

c# - 我可以在后台运行多个慢速进程,以便可以并行运行多个任务吗?

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

我有一个在 Core .NET 2.2 框架之上使用 C# 编写的控制台应用程序。

我的应用程序允许我使用 Windows 任务计划程序触发长时间运行的管理作业。

其中一项管理作业进行 Web-API 调用,该调用会在将文件上传到 Azure Blob 存储之前下载大量文件。以下是我的代码为完成工作需要执行的逻辑步骤

  1. 调用以 Mime 消息响应的远程 API,其中每条消息代表一个文件。
  2. 解析 Mime 消息并将每条消息转换为 MemoryStream 创建 MemoryStream 的集合

一旦我有了包含多个 1000 多个 MemoryStream 的集合,我想将每个 Stream 写入 Azure Blob 存储。由于写入远程存储很慢,我希望我可以使用自己的进程或线程执行每个写入迭代。这将允许我同时并行运行 1000 多个线程,而不必等待每个写入操作的结果。每个线程将负责记录在写入/上传过程中可能发生的任何错误。任何记录的错误都将使用不同的作业处理,因此我不必担心重试。

我的理解是调用异步写入/上传流的代码将完全做到这一点。换句话说,我会说“有一个 Stream 执行它并运行它需要的时间。只要任务完成,我真的不关心结果。”

测试时发现自己对调用async的理解有些不对。我的印象是,当调用用 async 定义的方法时,将在后台线程/worker 中执行,直到该过程完成。但是,当我测试代码时,我的理解失败了。我的代码告诉我,如果不添加关键字 awaitasync 代码就不会真正执行。同时,当加入关键字await时,代码会一直等到进程执行完毕后才继续执行。换句话说,为我的需要添加await会破坏异步调用方法的目的。

这是我的代码的精简版本,用于解释我要完成的任务

public async Task Run()
{
// This gets populated after calling the web-API and parsing out the result
List<Stream> files = new List<MemoryStream>{.....};

foreach (Stream file in files)
{
// This code should get executed in the background without having to await the result
await Upload(file);
}
}

// This method is responsible of upload a stream to a storage and log error if any
private async Task Upload(Stream stream)
{
try
{
await Storage.Create(file, GetUniqueName());
}
catch(Exception e)
{
// Log any errors
}
}

从上面的代码中,调用 await Upload(file); 可以正常工作,并且会按预期上传文件。但是,由于我在调用 Upload() 方法时使用了 await,因此在上传代码完成之前,我的循环不会跳转到下一次迭代。同时,删除 await 关键字,循环不会等待上传过程,但 Stream 从未实际写入存储,就好像我从未调用过代码一样。

如何并行执行多个 Upload 方法,以便在后台为每次上传运行一个线程?

最佳答案

将列表转换为“上传”任务列表,并用 Task.WhenAll() 等待所有任务:

public async Task Run()
{
// This gets populated after calling the web-API and parsing out the result
List<Stream> files = new List<MemoryStream>{.....};
var tasks = files.Select(Upload);

await Task.WhenAll(tasks);
}

参见 this post有关任务/等待的更多信息。

关于c# - 我可以在后台运行多个慢速进程,以便可以并行运行多个任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54526551/

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