Skip to main content
 首页 » 编程设计

C# 异步 Web 服务调用之受污染的结果

2024年02月23日30www_RR

我正在调用一个异步网络服务,发送多个请求并等待来自平台的响应。

我已经确定了我遇到的问题,但看不到导致它的逻辑错误,我是异步调用的新手,所以请原谅我糟糕的编码!

问题是我返回的结果集包含创建的每个批处理的相同 50 条记录。我很困惑!

非常感谢任何帮助,并将分发投票,这很紧急!

我写的代码如下:

    public DataTable Delete(DataTable Data, string ObjectType) 
    { 
        rowCount = Data.Rows.Count; 
        List<string[]> Batches = new List<string[]>(); 
        int time = 0; 
 
        Batches = BatchBuilder(Data); 
 
        results.Columns.Add("ID"); 
        results.Columns.Add("Success"); 
        results.Columns.Add("Errors"); 
 
        foreach (string[] batch in Batches) 
        { 
            string guid = Guid.NewGuid().ToString(); 
            guids.Add(guid); 
            service.deleteCompleted += new deleteCompletedEventHandler(service_deleteCompleted); 
            service.deleteAsync("Account", batch, guid); 
        } 
 
        while (processedCount != Batches.Count) 
        { 
            if (time == int.MaxValue - 1) 
            { 
                time = 0; 
            } 
            time++; 
        } 
 
        return results; 
    } 
 
    void service_deleteCompleted(object sender, deleteCompletedEventArgs e) 
    { 
        foreach (DeleteResult deleteResult in e.Result) 
        { 
            object[] resultRow = new object[3]; 
            if (deleteResult.id != null) 
                resultRow[0] = deleteResult.id; 
 
            resultRow[1] = deleteResult.success; 
 
            if (deleteResult.errors != null) 
                resultRow[2] = deleteResult.errors[0].Message; 
 
            results.Rows.Add(resultRow); 
        } 
        processedCount++; 
    } 
 
    public List<string[]> BatchBuilder(DataTable table) 
    { 
        List<string[]> Batches = new List<string[]>(); 
 
        while (!batchingDone) 
        { 
            string[] IDs = new string[50]; 
            int arrayCrawler = 0; 
 
            for (int v = 0; v < 50; v++) 
            { 
                IDs[arrayCrawler] = table.Rows[tableCrawler].ItemArray[0].ToString(); 
 
                arrayCrawler++; 
                tableCrawler++; 
 
                if (tableCrawler == table.Rows.Count) 
                { 
                    batchingDone = true; 
                    break; 
                } 
                if (arrayCrawler == 50) 
                { 
                    arrayCrawler = 0; 
                    break; 
                } 
            } 
 
            Batches.Add(IDs); 
        } 
 
        return Batches; 
    } 

请您参考如下方法:

我怀疑您的问题来自您的 service 全局变量,该变量在每次调用时都会重复使用。每次实例化一个新的服务实例。