jim*_*lan 1 .net c# asp.net-mvc caching async-await
困境,困境......
我一直在研究一个使用异步调用HttpClient库(GetAsync=>ConfigureAwait(false)等)的问题的解决方案.在一个控制台应用程序,我的DLL非常敏感,使用异步等待调用的混合物Parallel.ForEach(=>)真的让我发光.
现在为了这个问题.从这个测试工具移动到目标应用程序后,事情变得有问题.我正在使用asp.net mvc 4并且遇到了一些问题.主要问题是在控制器动作上调用我的进程实际上会阻塞主线程,直到异步操作完成.我尝试过使用async控制器模式,我尝试过使用过Task.Factory,我尝试过使用过new Threads.你说它,我尝试了所有的味道 - 然后一些!
现在,我很欣赏http的本质并不是为了促进像这样的长流程,而且这里有很多文章说不要这样做.但是,为什么我需要使用这种方法有减轻的原因.我需要在mvc中运行它的主要原因是因为我实际上通过在我的dll代码中引发事件来实时更新实时数据缓存(在mvc应用程序上).这意味着在整个异步操作完成之前,可以实时推送50-60个数据源的片段.因此,客户端应用程序可以在发出异步操作的几秒钟内收到部分更新.如果我将流程委托给在后台运行整个流程的控制台应用程序,我将无法再利用这些片段部分更新,这是整个架构选择背后的存在理由.
任何人都可以阐明一个解决办法,让我减轻线程阻塞,而在同一时间,让每一个异步片段通过我的对象模型被消耗,被送出到客户端应用光(我使用signalr,使这些客户端更新).一种nirvanna将是一种场景,其中可以在众多进程之间共享进程外缓存对象 - 然后缓存更新可以由我的mvc进程触发和使用(也就是http://devproconnections.com/aspnet- mvc/out-process-caching-aspnet).所以回到现实......
我还考虑过使用辅助Web服务来实现这一目标,但在over engineering我的解决方案再次出现之前会欢迎其他选项(已经有很多移动部件和大量的异步Actions).
很抱歉没有添加任何代码,我希望有实用的哲学/见解,而不是代码帮助,当然欢迎编码示例来说明我的问题的解决方案.
随着时间的推移,我会更新问题,因为我的思维过程仍然在成熟.
[编辑] - 为了清楚起见,下面的片段是我的兄弟格林代码碰撞(从更大的工作中提取):
Parallel.ForEach(scrapeDataBases, new ParallelOptions()
{
MaxDegreeOfParallelism = Environment.ProcessorCount * 15
},
async dataBase =>
{
await dataBase.ScrapeUrlAsync().ConfigureAwait(false);
await UpdateData(dataType, (DataCheckerScrape)dataBase);
});
Run Code Online (Sandbox Code Playgroud)
async并且Parallel.ForEach不要自然混合,所以我不确定你的控制台解决方案是什么样的.此外,Parallel几乎不应该在ASP.NET上使用它.
这听起来像你想要的只是使用Task.WhenAll.
另外,我认为你在ASP.NET上进行后台处理的原因是不正确的.完全有可能有一个单独的过程通过SignalR更新客户端.
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |