多线程MVVM应用程序中的隐式范围上下文

时间:2013-06-28 19:36:06

标签: c# multithreading unit-of-work

我正在使用一些async / await来处理具有大量多线程的WPF应用程序。我正在考虑在客户端中使用工作单元模式(带有隐式作用域)(让它的工作方式与TransactionScope非常相似),但无法确定存储上下文的位置。

我考虑过的一些事情:

  • 线程本地人;但这不会起作用,因为我们可能会在嵌套的工作单元中切换线程。
  • 静态;我相信如果同时执行两个不相关的工作单元,这将会失败

在我的服务层(webapi odata)中,我将工作单元附加到http上下文以允许跨线程嵌套。有没有人在客户端应用程序中尝试过这样的东西,并且有一个很好的方法来确定嵌套的工作单元?

1 个答案:

答案 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 blogCallContext.LogicalGetDataCallContext.LogicalSetData。逻辑调用上下文将跨线程流动,并且可以在任何async情况下工作。

这种方法有一些限制:

  1. 您必须使用.NET 4.5框架。 CallContext已在{。}}中生成{ - 1}},因此如果您的目标是.NET 4.0 / Phone / Silverlight,则无法正常运行。
  2. 您应该只存储不可变数据。如果您使用Microsoft.Bcl.Immutable
  3. ,这会变得更加容易