C# 如何确定一整批异步请求是否失败?

C# 如何确定一整批异步请求是否失败?,c#,asynchronous,error-handling,wsdl,C#,Asynchronous,Error Handling,Wsdl,第三方提供了一个界面,允许我搜索他们的客户数据库并检索他们的详细信息。例如照片、出生日期等 我将他们的WSDL导入Visual Studio,并使用异步方法检索客户详细信息 MyClient Client = new MyClient(); Client.FindCustomersCompleted += FindCustomersCompleted; Client.GetCustomerDetailsCompleted += GetCustomerDetailsCompleted; Clie

第三方提供了一个界面,允许我搜索他们的客户数据库并检索他们的详细信息。例如照片、出生日期等

我将他们的WSDL导入Visual Studio,并使用异步方法检索客户详细信息

MyClient Client = new MyClient();
Client.FindCustomersCompleted += FindCustomersCompleted;
Client.GetCustomerDetailsCompleted += GetCustomerDetailsCompleted;

Client.FindCustomersAsync("Jones");
下面是处理响应的两个事件

void FindCustomersCompleted(object sender, FindCustomersCompletedEventArgs e)
{
    foreach(var Cust in e.Customers)
    {
        Client.GetCustomerDetailsAsync(Cust.ID);
    }
}

void GetCustomerDetailsCompleted(object sender, GetCustomerDetailsCompletedEventArgs e)
{
    // Add the customer details to the result box on the Window.
}
因此,让我们假设我对“琼斯”的初始搜索没有返回结果或导致错误。它相当直截了当地告诉用户有一个错误或者没有找到结果,因为我只会收到一个响应

然而,如果我说为“琼斯”得到50个结果,那么我会打50个GetCustomerDetailsAsync电话,得到50个响应

假设服务器端出了问题,我没有得到任何有效的响应。每个GetCustomerDetailsCompleted事件都将收到一个错误/超时,我可以确定单个响应是否失败

确定我的所有响应都失败并且我需要通知用户失败的最佳方法是什么? 或者,如果50分之一的人成功了呢

我是否应该跟踪我的请求,并在收到响应时将其标记为成功

我应该跟踪我的请求并将其标记为成功吗 收到回复了吗


这也是我管理多个请求的方式。如果返回的结果没有错误,则标记,并跟踪标记,如果已处理所有返回,则在每次返回后进行评估。我不想换一种方式

我首先将基于事件的异步模式模型转换为基于任务的模式。这将允许使用内置的wait/async关键字,从而使代码更易于使用

下面是一个简单的实现:

在您的情况下,我不会更新每个事件的UI,而是将所有信息收集在一个变量中,并且仅在获得所有结果时显示

下面是一段代码,可以帮助您继续:

public class CustomerDetails
{
    public int Id {get; set;}
    public string Name {get; set;}
}

public class FindCustomersResult
{
    public FindCustomersResult()
    {
        CustomerDetails = new List<CustomerDetails>();
    }
    public List<CustomerDetails> CustomerDetails {get; set;}
}

public class ApiWrapper
{
    public Task<FindCustomersResult> FindCustomers(string customerName)
    {
        var tcs = new TaskCompletionSource<FindCustomersResult>(); 
        var client = new MyClient();
        client.FindCustomersCompleted += (object sender, FindCustomersCompletedEventArgs e) => 
            {
                var result = new FindCustomersResult();

                foreach(var customer in e.Customers)
                {
                    var customerDetails = await GetCustomerDetails(customer.ID);
                    result.CustomerDetails.Add(customerDetails);
                }
                tcs.SetResult(result);
            }
        client.FindCustomersAsync(customerName);    
        return tcs.Task;
    }

    public Task<CustomerDetails> GetCustomerDetails(int customerId)
    {
        var tcs = new TaskCompletionSource<CustomerDetails>(); 
        var client = new MyClient();
        client.GetCustomerDetailsCompleted += (object sender, GetCustomerDetailsCompletedEventArgs e) => 
            {
                var result = new CustomerDetails();
                result.Name = e.Name;
                tcs.SetResult(result);
            }
        client.GetCustomerDetailsAsync(customerId); 
        return tcs.Task;
    }
}
如果任何请求失败,这将失败

另外,我在记事本中编写了这个示例,如果它不编译或包含语法错误,请耐心等待。:)

var api = new ApiWrapper();
var findCustomersResult = await api.FindCustomers("Jones");