我正在使用一些async / await来处理具有大量多线程的WPF应用程序。我正在考虑在客户端中使用工作单元模式(带有隐式作用域)(让它的工作方式与TransactionScope非常相似),但无法确定存储上下文的位置。
我考虑过的一些事情:
在我的服务层(webapi odata)中,我将工作单元附加到http上下文以允许跨线程嵌套。有没有人在客户端应用程序中尝试过这样的东西,并且有一个很好的方法来确定嵌套的工作单元?
答案 0 :(得分:1)
工作单元并不一定意味着上下文是隐式的(或者是范围内的)。我认为UoW显式是很正常的(例如,你的BO类型会保留对它们“拥有”上下文的引用,这本身就是线程安全的)。也就是说,使用async
可以实现隐式上下文。
仅在ASP.NET请求上下文中使用await
时,最佳选择是使用HttpContext.Items
。或者,您可以使用线程安全的静态成员。
仅在UI上下文中使用await
时,可以使用常规静态成员。
使用多线程时,可以使用线程本地。
但是,如果您的任何代码使用多线程 with await
(例如ConfigureAwait(false)
,或将async
lambda传递给Task.Run
)那么这些选项都不会起作用。
AFAIK,只有一个通用解决方案,I describe on my blog:CallContext.LogicalGetData
和CallContext.LogicalSetData
。逻辑调用上下文将跨线程流动,并且可以在任何async
情况下工作。
这种方法有一些限制:
CallContext
已在{。}}中生成{ - 1}},因此如果您的目标是.NET 4.0 / Phone / Silverlight,则无法正常运行。