尝试通过异步调用从Web服务请求数据。
开始了一个类似的Wait until event has finished帖子,在这种情况下我可以使用None-Async方法。现在情况并非如此。当前的Web服务没有可用的非异步方法。那么我将如何去决定事件" RespService_Send_Completed"在启动/继续循环中的下一行之前已完成。如果事件成功,则从Web服务返回的是" e.Result"中的UUID。
foreach (string id in uuid)
{
WebRef.ResponderService RespService = new WebRef.ResponderService();
_uuid = id;
RespService.SendDataAsync(id);
RespService.SendCompleted += RespService_Send_Completed;
}
调用方法
时,代码工作正常public void InvokeSend(string[] uuid)
在string [] uuid中有一个值。但是当数组包含多个代码时,代码将失败。
public class SendReciveSoapData
{
private string _uuid { get; set; }
public void InvokeSend(string[] uuid)
{
foreach (string id in uuid)
{
WebRef.ResponderService RespService = new WebRef.ResponderService();
_uuid =id;
RespService.SendDataAsync(id);
RespService.SendCompleted += RespService_Send_Completed;
}
}
void RespService_Send_Completed(object sender, WebRef.CompletedEventArgs e)
{
//Saving Response Data to database
string SuccessID = e.Result;
string TransactionID = _uuid;
DataBase db = new DataBase();
db.UpdateResponseID(SuccessID, TransactionID);
}
}
答案 0 :(得分:0)
_uuid
私有字段可能是您遇到问题的原因。
具体来说,foreach
循环不会等到已完成的事件发生,然后再继续下一个id
。每次迭代都会覆盖_uuid
字段,并且由于循环速度很快 - 除非有很多(数千)次调用要创建,否则循环将在任何已完成的事件被提升之前完成。当完成的事件被曝光时,根本无法知道将_uuid
设置为什么值。
很有可能循环结束,_uuid
将成为所有已完成事件的最后id
。
我需要了解有关您确实要知道的API的更多信息,但xxxxAsync()
方法通常会返回Task<>
。无论是Task<>
还是其他内容,都要保存数组中的所有返回值,并在完成后从数组中删除。
同样,如果没有关于API的更多信息,则无法更具体。
答案 1 :(得分:0)
我通过调用&#34; InvokeSend&#34;解决了这个问题。 - 事件的方法。然后处理发送到Class的数组,删除&#34; Current&#34;每次迭代后的uuid值。直到数组为空。
Source_song_id