12

userRepoリポジトリ ( )を使用する方法があります。

    public override Task<IdentityResult> CreateLocalUserAsync(IUser user, string password, CancellationToken cancellationToken)
    {
        var task = new Task<IdentityResult>(() => {

            TUserEntity newUser = new TUserEntity
            {
                Id = user.Id,
                UserName = user.UserName,
                Password = password
            };

            userRepo.Save(newUser).Flush();

            return new IdentityResult(true);
        }, cancellationToken);

        task.Start();

        return task;
    }

userRepoオブジェクトには、 を使用する依存関係がありますHttpContext.Current。これらはどちらも ninject を使用して解決されInRequestScopeます。

上記のメソッドはAccountController、Mvc 5 のデフォルト内で呼び出されます。

var result = await IdentityManager.Users.CreateLocalUserAsync(user, model.Password);

この設定をweb.configに追加しようとしました:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

また、私は間違いなく .NET 4.5 を使用しています。これは私のweb.configにもあります:

<httpRuntime targetFramework="4.5" />

HttpContextタスク内の の依存関係がuserRepo情報を使用しており、両方のオブジェクトが Ninject を使用して解決されているため、タスクを開始する前に から情報を取得することはできません。

HttpContext.Currentそれがnullにならないようにするにはどうすればよいですか?

4

1 に答える 1

17

ここでの「タスクに適した同期コンテキスト」は、 からの継続に適用されawaitますresult。ただし、 とは関係ありませtask.Start。これTaskSchedulerは、同期コンテキストではなく、 に関連しています。

基本的に、ワーカーでこれを実行することにより、(結果としてプロセス中に) そのワーカーを http コンテキストから切り離すことになります。次のいずれかを行う必要があります。

  • http-context から必要な情報を取得し、それワーカーに渡す、または
  • 労働者を使わない

個人的には、これをワーカーにプッシュすることで多くを得ることができるとは思えません。本当に行きたい場合asyncは、レポがメソッドを内部的にサポートすることが理想的*Asyncです。これには、スレッドを使用するだけでは不十分です。通常は、非同期 SQL メソッドを使用するなど、アーキテクチャの変更を意味します。使用するためにゼロから作成されたものasyncと、同期コンテキスト対応の継続 (別名await) は、http-context のようなものを自動的に保持します。

ここでの重要な違いは、async/のawait実装は線形ですが、連続的ではないということです。つまり、

 <===(work)==>
                    <===(callback; more work)===>
                                                     <===(another callback)===>

一方、既存のコードは潜在的に並行して実行します。つまり、

<==========(original work)=================>
         <===========(task on worker thread)=============>

async/awaitアプローチが基本的に線形であるという事実は、http-context のようなものへのアクセスにはるかに適しています。端から端まで同じスレッド。

于 2013-10-01T09:18:43.377 に答える