如何处理来自多个线程的单个结果?
How to handle single result from multiple threads?
假设我可以读取的文件格式很少。例如。 xml、yaml 和 json。
对于每种格式,我都有特定的 reader,但直到运行时我才知道放置了哪个文件,因此我尝试使用所有这些 reader 读取文件。
整个过程目前是异步的。
我想要的只是 return 只有 'FileReaderTask' 的正确方法,结果已完成。
到目前为止我已经有了这个,但我不太喜欢它。
尤其是我return 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
}
你的进程是异步的,但它没有使用多个 threads.In 这种情况是一件好事,因为读取同一个文件的线程会相互竞争。
您当前的方法使用 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);
}
}
循环一个接一个地等待各个任务,因此如果成功的任务先于不成功的任务完成,您的代码将不会在处理响应之前等待剩余任务的完成。
假设我可以读取的文件格式很少。例如。 xml、yaml 和 json。 对于每种格式,我都有特定的 reader,但直到运行时我才知道放置了哪个文件,因此我尝试使用所有这些 reader 读取文件。 整个过程目前是异步的。
我想要的只是 return 只有 'FileReaderTask' 的正确方法,结果已完成。
到目前为止我已经有了这个,但我不太喜欢它。 尤其是我return 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
}
你的进程是异步的,但它没有使用多个 threads.In 这种情况是一件好事,因为读取同一个文件的线程会相互竞争。
您当前的方法使用 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);
}
}
循环一个接一个地等待各个任务,因此如果成功的任务先于不成功的任务完成,您的代码将不会在处理响应之前等待剩余任务的完成。