1

私は次のようなコントローラーアクションを呼び出すためにajaxリクエストを行います:

コントローラ:

    [AsyncTimeout(8000, Order = 3)]
    [HandleError(ExceptionType = typeof(TimeoutException), Order = 4, View = "TimeoutError")]
    public async Task<JsonResult> RemovePackageAsync(CancellationToken cancellationToken, string packageId, ICollection<int> ids)
    {
        PackageRemoveItem removeItem = new PackageRemoveItem()

        .............blah blah blah

        await this.deviceRepository.RemovePackageAsync(removeItem);
        return  this.Json(JsonConvert.SerializeObject(removeItem.Machines));
    }

方法:

    public async Task RemovePackageAsync(PackageRemoveItem removeItem, CancellationToken cancelToken = default(CancellationToken))
    {
        await Task.Run(() =>
        {
            int[] machines = removeItem.Machines.Keys.ToArray();
            .......


        });
    }

ただし、これをデバッグで実行すると、ajax応答は「RemovePackageAsync」が終了するまで待機します。ここで達成しようとしているのは、このメソッドを別のスレッドで呼び出し、実行させて、終了するのを待たずに、コントローラーからすぐに「真の」応答を取得することです。

ajax call => controller =>新しいスレッドでメソッドを呼び出します。終了するのを待たないでください。ただし、trueを返します=>必要な限りメソッドを実行します。そして私は他のことをするようになります

4

1 に答える 1

3

非同期コントローラーは、Webサーバーで非同期に動作し、スレッドプールからスレッドを解放して同時要求を処理します。ブラウザは、アクションによって結果が返されるのを同期的に待機します。

必要なのは、スレッドまたはタスクを生成してすぐに戻る標準のコントローラーアクションです。

ただし、そうすると、結果のデータを返すことができなくなります。

于 2012-11-09T11:17:44.753 に答える