gpt4 book ai didi

c# - 如何处理来自多个线程的单个结果?

转载 作者:行者123 更新时间:2023-11-30 15:56:14 25 4
gpt4 key购买 nike

假设我可以读取的文件格式很少。例如。 xml、yaml 和 json。对于每种格式,我都有特定的阅读器,但直到运行时我才知道放置了哪个文件,所以我尝试使用所有这些阅读器读取文件。整个过程目前是异步的。

我想要的只是一个正确的方法来只返回完成结果的“FileReaderTask”。

到目前为止我已经有了这个,但我不太喜欢它。尤其是我返回 null 的部分

    public async Task<ReadResponse> Read(string id)
{
var readerDetails = _readerDetailsRepository.GetAll();
var tasks = readerDetails.Select(readerDetail => _reader.ReadAsync(readerDetail, id)).ToList();

foreach (var result in await Task.WhenAll(tasks))
{
if (!string.IsNullOrEmpty(result)) // only one will have the response !
{
return await HandleResponse(_jsonConverter.Convert<ReadResponse>(result), id);
}
}
return null; // ?? seems pretty bad
}

最佳答案

你的进程是异步的,但它没有使用多线程。在这种情况下这是一件好事,因为读取同一个文件的线程会相互竞争。

您当前的方法使用 WhenAll,它会等待所有任务完成后再选择结果。这很好,假设所有失败的任务都先完成。您不必等待所有任务,而是在它们完成时处理它们:

var tasks = readerDetails.Select(readerDetail =>
_reader.ReadAsync(readerDetail, id).ConfigureAwait(false)
).ToList();
foreach (var task in tasks) {
var result = await task;
if (!string.IsNullOrEmpty(result)) {
return await HandleResponse(_jsonConverter.Convert<ReadResponse>(result), id);
}
}

循环一个接一个地等待各个任务,因此如果成功的任务先于不成功的任务完成,您的代码将不会在处理响应之前等待剩余任务的完成。

关于c# - 如何处理来自多个线程的单个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47248966/

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