【发布时间】:2019-05-25 06:47:54
【问题描述】:
我在 ASP.Net 网页表单页面中有以下代码,它基本上检查某个值是否在缓存中,如果没有,它会调用一个获取数据然后将其存储在缓存中的方法。获取数据的方法如下
ChartRenderingHelper.GenerateBidsStatusCreated(currYear.ToString(), currQuarter.ToString(), currYearType.ToString())
使用 EF 调用存储过程,这 3 个调用都调用单独的 SP。现在我按顺序执行,所以如果每个 SP 需要 5 秒,则总操作需要 15 ..我正在考虑使用一些任务来运行这些并行,但不知道如何更改我当前的代码来做到这一点。
bidsCreated.Value = DashboardCacheHelper.IsIncache(bidsCreatedKey, useCaching) ? DashboardCacheHelper.GetFromCache(bidsCreatedKey) : (string)DashboardCacheHelper.SaveCache(bidsCreatedKey, JsonConvert.SerializeObject(ChartRenderingHelper.GenerateBidsStatusCreated(currYear.ToString(), currQuarter.ToString(), currYearType.ToString())), DateTime.Now.AddDays(cacheDays));
bidsSubmitted.Value = DashboardCacheHelper.IsIncache(bidsSubmittedKey, useCaching) ? DashboardCacheHelper.GetFromCache(bidsSubmittedKey) : (string)DashboardCacheHelper.SaveCache(bidsSubmittedKey, JsonConvert.SerializeObject(ChartRenderingHelper.GenerateBidsStatusSubmitted(currYear.ToString(), currQuarter.ToString(), currYearType.ToString())), DateTime.Now.AddDays(cacheDays));
bidsClosed.Value = DashboardCacheHelper.IsIncache(bidsClosedKey, useCaching) ? DashboardCacheHelper.GetFromCache(bidsClosedKey) : (string)DashboardCacheHelper.SaveCache(bidsClosedKey, JsonConvert.SerializeObject(ChartRenderingHelper.GenerateBidsStatusClosed(currYear.ToString(), currQuarter.ToString(), currYearType.ToString())), DateTime.Now.AddDays(cacheDays));
如何同时完成这 3 个作业?使用 TPL 我知道我们可以并行运行方法
Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());
这是推荐的方法吗?如果我说 12 个操作需要并行运行,所有使用 EF 调用 SQL 存储过程都会是性能问题。
【问题讨论】:
-
您可以使用Task.Run,然后使用Task.WaitAll。
-
@SaniSinghHuttunen EF 有异步方法,所以你不需要
Task.Run,OP 使用 ASP.Net 所以Task.WaitAll会导致死锁 - 不完全确定你的建议是积极邪恶还是……没有深思熟虑? -
不要在 ASP.Net 页面中直接使用 Parallel,因为线程可能会在未完成工作的情况下被挂起,并且与
async方法无法正常工作
标签: c# task-parallel-library .net-4.5