首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步应用程序中的任务- IO绑定

同步应用程序中的任务- IO绑定
EN

Stack Overflow用户
提问于 2018-11-06 16:18:36
回答 1查看 51关注 0票数 0

我们正在研究一个老的比较器。

当用户进行调查时,我们同时调用10-30个不同的webservice (REST,SOAP)。很经典所以。每个our服务都由我们的应用程序中的一个客户端重新表示。

所以代码就像:

代码语言:javascript
复制
//Get the request list of client to call
clientRqListToCall = BuildRequest(userContext);
List<Task> taskList = new List<Task>();

//Call the different client
Foreach (ClientRequest clientRq in clientRqListToCall) {
    Task task = Task.Run(() => CallClient(clientRq));
    taskList.Add(task);
}
//wait client until timeOut
Task mainWaiterTask = Task.WhenAll(taskList);
mainTask.ConfigureAwait(false);
mainTask.Wait(timeout);

很简单。(不确定是否需要configureAwait )。每个客户端的响应都存储在ClientRequest的一个字段中,因此我们不使用mainTask.Result (如果客户端超时,我们需要能够继续使用其他客户端的超时,并且它们经常超时!客户端调用行为与防火墙非常相似)。

这个应用程序有点旧,我们的搜索引擎是同步的。不同are服务的调用在不同的CallClient callTree中,根据研究背景,在are服务调用之前调用5到15个不同的功能。每个webservice电话都很长(每个1到15s )!这一点似乎很重要!这些不是pings简单的pings请求。

行动/变化?

所以这是一个I/O约束的问题,我们知道Task.Run可以很好地解决CPU绑定问题,而不是I/O问题,问题是如何使这个代码更好?

我们阅读了很多关于这个主题的不同文章,感谢Stephen (http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html),但是我们不确定我们的选择/路线图,这就是为什么我张贴这张票。

  • 我们可以使代码是异步的,但是我们必须重新构建整个CallClient调用树(数百个函数)。这是唯一的解决办法吗?当然,我们可以使用bool参数哈克(https://msdn.microsoft.com/en-us/magazine/mt238404.aspx)逐个迁移webservice。=> --我们必须从代价最高的( IO) we服务开始,或者仅仅是webservice调用的数量是重要的,所以我们应该启动最简单的?换句话说,如果我有一个大客户端,具有10s响应平均值和大量数据,那么我们必须先异步吗?或者应该从具有相同数据量的小部分(1-2s)开始。我可能错了,但是线程是以同步方式锁定的,直到task.run()很明显地完成了10 s任务一直锁定一个线程,但是就I/O空闲而言,线程越快越好。下载的数据量重要吗?还是我们应该仅仅从webservice计时器的角度来思考呢?
  • Task.Run使用应用程序threadPool,我们必须在.Run(.)之间进行选择或者Task.Factory.StartNew(.,TaskCreationOptions.LongRunning)为了(很多时候),创建新线程,所以可能得到一个更好的线程。=> I在子test上进行了一些测试,使用控制台应用程序,在所有场景中,.Run()似乎都比Task.Factory.StartNew快25%到33%。当然,这是一个预期的结果,但是在一个拥有大约200个用户的fear应用程序上,我不确定结果会是一样的,我担心池会满,任务会在没有结束的情况下互相跳转。注意:如果使用startNew,则WaitAll(超时)重新放置WhenAll。

今天,我们平均有20到50个客户可以同时进行一项研究。应用程序的工作没有大的问题,我们没有死锁,但有时我们可以看到一些延迟的任务执行在我们这一边。我们的Cpu使用率很低(<10%),Ram也是绿色的(<25%)。

我知道有很多关于任务的票,但是很难把它们合并在一起来匹配我们的问题。我们还读到了自相矛盾的建议。

EN

回答 1

Stack Overflow用户

发布于 2018-11-06 16:36:17

我以前使用过Parallel.ForEach来处理多个I/O操作,我没有看到上面提到过它。我不确定它是否会处理您需要的东西,看到传递给循环的函数对于每个循环都是相同的。也许,再加上一种策略模式/委托,您可以实现您所需要的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53175824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档