Asp.net mvc 4 HttpContext.Current在MVC4中使函数异步时为null

Asp.net mvc 4 HttpContext.Current在MVC4中使函数异步时为null,asp.net-mvc-4,asynchronous,task-parallel-library,Asp.net Mvc 4,Asynchronous,Task Parallel Library,我目前正在VS2010-SP1中处理MVC4。我在中创建了一个函数 控制器类是异步的。作为其中的一部分,我创建了控制器类 派生自AsyncController并添加了以下两个方法(请参见代码第1节和第2节) (见下文第2段)。一个方法以Async结尾(参见代码第1节),另一个方法以Async结尾 已完成(见代码第2节)。问题出在我正在尝试的模型课上 从HttpContext使用凭据访问我的Web服务(请参见下面的代码3)。这个 进行异步调用时,上下文将变为null。在新的线程中 httpcont

我目前正在VS2010-SP1中处理MVC4。我在中创建了一个函数 控制器类是异步的。作为其中的一部分,我创建了控制器类 派生自AsyncController并添加了以下两个方法(请参见代码第1节和第2节) (见下文第2段)。一个方法以Async结尾(参见代码第1节),另一个方法以Async结尾 已完成(见代码第2节)。问题出在我正在尝试的模型课上 从HttpContext使用凭据访问我的Web服务(请参见下面的代码3)。这个 进行异步调用时,上下文将变为null。在新的线程中 httpcontext不可用。如何将上下文从主线程传递到新线程 创造

代码第1节

public void SendPlotDataNewAsync(string fromDate, string toDate, string item)
{

         AsyncManager.OutstandingOperations.Increment();
                    var highChartModel = new HighChartViewModel();
                    Task.Factory.StartNew(() =>
                    {
                          AsyncManager.Parameters["dataPlot"] = 
highChartModel.GetGraphPlotPointsNew(fromDate, toDate, item);
                          AsyncManager.OutstandingOperations.Decrement();
                      });

}
代码第2节

 public JsonResult SendPlotDataNewCompleted(Dictionary<string, List<ChartData>> 
 dataPlot)
 {
      return Json(new { Data = dataPlot });
 }
public JsonResult SendPlotDataNewCompleted(字典
数据图)
{
返回Json(新的{Data=dataPlot});
}
代码第3节

public List<MeterReportData> GetMeterDataPointReading(MeterReadingRequestDto 
meterPlotData)
{

            var client = WcfClient.OpenWebServiceConnection<ReportReadingClient,   
IReportReading>(null, (string)HttpContext.Current.Session["WebserviceCredentials"] ?? 
string.Empty);

                try
                {
                    return 
ReadReportMapper.MeterReportReadMap(client.GetMeterDataPointReading(meterPlotData));
                }
                catch (Exception ex)
                {
                    Log.Error("MetaData Exception:{0},{1},{2},{3}", 
ex.GetType().ToString(), ex.Message, (ex.InnerException != null) ? 
ex.InnerException.Message : String.Empty, " ");
                    throw;
                }
                finally
                {
                    WcfClient.CloseWebServiceConnection<ReportReadingClient, 
IReportReading> (client);
                }

                }
公共列表GetMeterDataPointReading(MeterReadingRequestDto
meterPlotData)
{
var client=WcfClient.OpenWebServiceConnection(null,(字符串)HttpContext.Current.Session[“WebserviceCredentials”]??
字符串(空);
尝试
{
返回
ReadReportMapper.MeterReportReadMap(client.GetMeterDataPointReading(meterPlotData));
}
捕获(例外情况除外)
{
错误(“元数据异常:{0},{1},{2},{3}”,
例如GetType().ToString(),例如Message,(例如InnerException!=null)?
ex.InnerException.Message:String.Empty,“”;
投掷;
}
最后
{
WcfClient.CloseWebServiceConnection(客户端);
}
}

HttpContext。当前的
null
,因为您的任务是在没有
AspNetSynchronizationContext
同步上下文的池线程上执行的

使用TaskScheduler.FromCurrentSynchronizationContext()


下次请尝试在帖子和代码格式上做得更好:谢谢。当我添加以上内容时,我得到了错误函数StartNew不能接受第二个参数TaskScheduler.FromCurrentSynchronizationContext()。我正在VS2010 SP1中使用MVC4。谢谢。工作得很有魅力。
Task.Factory.StartNew(() =>
    {
        AsyncManager.Parameters["dataPlot"] =
            highChartModel.GetGraphPlotPointsNew(fromDate, toDate, item);
        AsyncManager.OutstandingOperations.Decrement();
    },
    CancellationToken.None,
    TaskCreationOptions.None, 
    TaskScheduler.FromCurrentSynchronizationContext());