如何处理多个返回的Task <response>

时间:2016-11-18 19:25:34

标签: c# asynchronous async-await

我在这里搜索过的问题,我看到的只是简单的理论BS。所以这是我的场景:我们有一个新的应用程序和一个被宠坏的消费者与他们自己的旧系统。因此,在我们的系统中,当评估达到特定状态时,我们将所有数据传输到他们的服务。

第一部分很简单:从记录中获取数据,将其放入数据交换中,然后将数据发送给它们。但第二部分是它变得很滑,因为它需要发送所有支持文件。因此,在现实世界的案例中,我有一份推荐文件,一份评估文件和一份调查结果摘要。所以在我的主要代码中,我只是这样说:

if (client.ReferralDocument != null)
    response = TransmitDocumentAsync(client.ReferralDocument);
if (client.Assessment != null)
    response = TransmitDocumentAsync(client.Assessment);
if (cilent.Summary != null)
    response = TransmitDocumentAsync(client.Summary);

现在调用的方法是异步的,它只是

public static async Task<Response> TransmitDocumentAsync(byte[] document)
{
     InterimResponse x = await proxy.InsertAttachmentAsync(document, identifier);
     return new Task<Response>(new Response(InterimResponse);
}

所以我基本上可以将这些文件扔到墙上。无需等待即可上传。但我所坚持的是如何处理返回的对象以及如何知道它与哪个文档相关联?

我要问的是,在三次调用之后我需要添加什么来处理返回的错误以及出现的任何其他问题或异常?我只是在等待回来吗?我有3个返回对象(referalResponse,assessmentResponse,summaryResponse)并在每个对象上发出等待吗?我是否过度思考这个问题,只是让事情结束而不关心结果? :)

1 个答案:

答案 0 :(得分:2)

如果你想一次await一个:

if (client.ReferralDocument != null)
  await TransmitDocumentAsync(client.ReferralDocument);
if (client.Assessment != null)
  await TransmitDocumentAsync(client.Assessment);
if (cilent.Summary != null)
  await TransmitDocumentAsync(client.Summary);

如果您想要全部发布,然后同时await所有回复:

var responses = new List<Task>();
if (client.ReferralDocument != null)
  responses.Add(TransmitDocumentAsync(client.ReferralDocument));
if (client.Assessment != null)
  responses.Add(TransmitDocumentAsync(client.Assessment));
if (cilent.Summary != null)
  responses.Add(TransmitDocumentAsync(client.Summary));
Response[] r = await Task.WhenAll(responses);

在旁注中,您的TransmitDocumentAsync不正确。它不应该构建new Task,只能构建new Response