17

Asyncnew演算子と演算子を使用Awaitしてデータベースからオブジェクトのコレクションを返そうとするたびに、Invalid Operation例外が発生します。単一のアイテムのみを返すために使用すると、正常に機能します。

コントローラーコード:

public async Task<ActionResult> EnvironmentList()
{
    EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess();
    ICollection<Environment> environments = await dataAccess.GetAllEnvironmentsAsync();
    return PartialView(environments);
}

コードを表示:

<div class="ECURightCol">
<h3>Table Dumps</h3>
@Html.Action("EnvironmentList", "Environment")
@Html.Action("ComputerList", "Computer")
@Html.Action("ProductList", "Product")
@Html.Action("InstanceList", "Instance")
@Html.Action("ProfileList", "Profile")

データアクセスコード:

public ICollection<Environment> GetAllEnvironments()
{
    using (EcuWebDataContext db = new EcuWebDataContext())
    {
        return db.Environments.OrderBy(e => e.Name).ToList();
    }
}

public async Task<ICollection<Environment>> GetAllEnvironmentsAsync()
{
    return await Task.Run(() => GetAllEnvironments());
}

私が得るエラーは次のとおりです。

説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとそれがコードのどこで発生したかについての詳細は、スタックトレースを確認してください。

例外の詳細:System.InvalidOperationException:HttpServerUtility.Executeは、非同期操作が完了するのを待っている間にブロックされました。

4

3 に答える 3

29

まず第一に、子アクションで非同期処理を使用することはできません。これがあなたがやろうとしていることだと思います。

次に、別のスレッドをスピンアップして、以下のコード行でコードを実行することにより、ここで非同期処理を行っていません。

Task.Run(() => GetAllEnvironments());

1 日の終わりにスレッドがブロックされ、コンテキスト スイッチのオーバーヘッドだけが発生します。EF6 では、非同期処理がサポートされます。純粋な ADO.NET を使用した非同期クエリについては、以下をご覧ください。

ASP.NET MVC 4 のタスクベースの非同期プログラミング モデル (TAP) を使用した非同期データベース呼び出し

于 2012-12-19T19:09:26.680 に答える
-2

この質問に回答してからしばらく経ちました。<system.web>しかし、私はMVC 5で同様の状況にあり、web.configファイルのセクションの下にある次の行をコメントアウトするだけで、[ChildActionOnly]を非同期で機能させることができました。

<system.web>
    <!--<httpRuntime targetFramework="4.5" />-->

編集:状況の実際の解決策を見つける間、これを回避策と考えてください。以下のLeriのコメントをご覧ください。

于 2016-04-20T14:22:46.157 に答える