1

我已经阅读了许多文章,为了在 4.5 之前的版本中保留 HttpContext.Current,我们应该传递处理线程的 SynchornizationContext。
这是我试图执行的代码:

TaskScheduler taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() => HandleInquiry(currentInquiry, request),
                                                    CancellationToken.None,
                                                    TaskCreationOptions.None, 
                                                    taskScheduler)

当我通过这段代码进行调试时,我可以在任务调度之前确认 taskScheduler 包含 AspNetSynchronizationContext。但是,在 HandleInquiry 方法内(在任务内), SynchronizationContext.Current 为空,而 HttpContext.Current 也为空。我确定我遗漏了一些明显的东西。

4

2 回答 2

3

在后台任务中访问 HttpContext 是一个糟糕的设计。正确的方法是仅将所需的信息作为参数传递。但是,如果您依赖一些在此阶段无法修改的遗留和编写错误的代码,您可以将整个 HttpContext 作为参数传递并在任务中重新分配它:

Task.Factory.StartNew(
    state => 
    {
        System.Web.HttpContext.Current = (HttpContext)state;
        HandleInquiry(currentInquiry, request);
    },
    System.Web.HttpContext.Current
);
于 2013-01-26T20:01:24.553 回答
0

您可以在 Web.config 文件的 appSettings 部分添加key="aspnet:UseTaskFriendlySynchronizationContext" value="true"的键/值对

于 2015-01-19T05:39:28.273 回答