2017-01-13 59 views
2

我正在使用TPL在我的代码中创建新任务。所有这些都可以提高性能。但是每当有像Context.currentuser.iDentifier这样的HTTPContext对象。这段代码会抛出一个异常说HTTP对象对象不可用。空引用异常。 我想知道如何将上下文对象传递给任务对象?为什么httpcontext对象在使用任务并行库任务时不可用?

+0

的[?什么是一个NullReferenceException,以及如何解决呢(可能的复制http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – rene

+0

只有在处理传入请求的线程中访问它时,HttpContext.Current才为空。使用TPL你可以在不同的线程中执行代码。详细信息 - http://stackoverflow.com/questions/19509672/why-is-httpcontext-current-null – Nikolay

+0

@rene,这不重复。你提到的问题是通用的.NET框架空引用异常。 – kevalsing

回答

5

这是因为并行线程没有在相同的上下文中执行。你需要通过SynchronizationContext它。 在TPL中,您可以使用TaskScheduler.FromCurrentSynchronizationContext()来传递上下文。

在我的项目之一,我已经做了这样的事情 -

Task.Factory.StartNew(() => MyMethod(), 
          CancellationToken.None, 
          TaskCreationOptions.None, 
          TaskScheduler.FromCurrentSynchronizationContext());