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はnullであり、HttpContext.Currentもnullです。私は明らかな何かを見逃していると確信しています。

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 に答える