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

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);
    }
}

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