4

タスクが完了した後にこれが私のビューを返さない理由がわかりません。その理由については、Google で多くのことを見つけることができます。

public async Task<ActionResult> GetUserAsync()
    {

        var value = Task.Factory.StartNew(() => _userService.GetUser("ausername"));

        await Task.WhenAll(value);

        return View("GetUser");
    }
4

4 に答える 4

23

さて、何時間にもわたるデバッグと髪の毛の残りの部分の引き抜きの後、犯人を見つけました。それは私の WindsorActionInvoker でした!! ControllerActionInvoker から AsyncControllerActionInvoker への変更により、非同期タスクが意図したとおりに機能しない問題が修正されました。

これが誰かに役立つことを願っています。

public class WindsorActionInvoker : AsyncControllerActionInvoker
{
    private readonly IKernel _kernel;


    public WindsorActionInvoker(IKernel kernel)
    {
        _kernel = kernel;
    }

    protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext,
                                                                           IList<IActionFilter> filters,
                                                                           ActionDescriptor actionDescriptor,
                                                                           IDictionary<string, object> parameters)
    {
        foreach (IActionFilter actionFilter in filters)
        {
            _kernel.InjectProperties(actionFilter);
        }
        return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
    }
}
于 2013-07-24T05:55:15.053 に答える
2

このプロジェクトは以前のバージョンからアップグレードされましたか? 参照しているライブラリが古いバージョンの MVC を依存関係として参照していないことを確認してください。この正確な問題を修正するには...

私のweb.configから以下を削除しました:

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

targetFramework が .NET 4.5 であることを確認

<compilation debug="true" targetFramework="4.5">

また、グローバル フィルターの従来のソリューションであったライブラリFluent Filtersへの参照を削除しました。

これらの変更により、コントローラーからタスクを返すことができました。

于 2014-05-22T21:56:36.230 に答える
0

完了すると、計算の結果を含む Task が返されます。

これは C# のシンタックス シュガーであり、慣れるまでは奇妙に見えるかもしれません。非同期にならずに結果を取得したい場合 (ブロッキング呼び出しを行う) はvar r = await GetUserAsync();、 と書くことができr、タイプは になりますActionResult

于 2013-07-17T22:14:46.217 に答える