当前位置: 首页 > 编程语言 > C#

异步调用webservice等待所有线程完成分享

时间:2023-04-11 00:20:46 C#

异步调用webservice等待所有线程完成代码:foreach(stringvinoptions){IListnodes=_pi.GetData(v);_dbService.SaveToDb(节点);}GetData实现如下所示:publicIListGetData(stringv){IListnodes=null;试试{varclient=newWsClient();IEnumerablewsNodes=client.getNodes(newgetClassLevel{code=v});节点=ProcessData(wsNodes);}返回节点;运行每次下载/保存到数据库并等待所有线程完成,或者可能有其他方法可以提高此类代码的性能,你能帮帮我吗?要提高可伸缩性(即您的Web应用程序可以同时处理的请求数),您需要减少应用程序为每个请求使用的线程数。因此,您不应等待所有线程完成,而应使用自然的异步API,这些API在操作挂起时不会阻塞线程。可以在此处找到有关此的更多详细信息。如果你可以使用.NET4.5,你的具体情况可以像这样得到改善:publicvoidPage_Load(objectsender,EventArgse){}publicasyncTaskProcessDataAsync(){vartasks=options.Select(v=>_pi.GetDataAsync(v));等待Task.WhenAll(任务);varnodes=tasks.Select(t=>t.Result);_dbService.SaveToDb(节点);}publicasyncTask>GetDataAsync(stringv){IListnodes=null;使用(varclient=newWsClient()){IEnumerablewsNodes=awaitclient.getNodesAsync(newgetClassLevel{code=v});节点=ProcessData(wsNodes);}返回节点;WsClient的客户端代理可能已经有一个名为getNodesAsync的异步版本的getNodes(如果没有,请检查一下)。ProcessDataAsync启动一组并行非阻塞GetDataAsync任务(针对每个节点)并异步等待它们完成。这就是使该代码可以很好地扩展的原因。您可以通过异步保存数据来进一步改进ProcessDataAsync,即await_dbService.SaveToDbAsync(nodes),如果您可以利用异步的基于任务的DBAPI(例如使用EF6)。这将全部并行下载并通过一次写入将它们存储到数据库中。var任务=选项。Select(o=>Task.Run(()=>GetData(o)));任务。WaitAll(任务。ToArray());变种节点=任务。SelectMany(t=>t.Result);_dbService.SaveToDb(节点);这将启动一个异步调用publicdelegateIListSaveToDb(IListmyParam);SaveToDb_saveToDb=newSaveToDb(objService.SaveToDb);IAsyncResultasyncSearchResult=saveToDb.BeginInvoke(input,null,null)这会等待执行完成并返回值:–以上为C#学习教程:异步调用webservice,等待所有线程完成共享内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——IListresult=asyncSearchResultEndInvoke();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: