2

次のコードを使用して、TaskFactory を使用して新しいタスクを開始しています。

var task = Task.Factory.StartNew(async () =>
{
    await Task.Run(() =>
    {
        // Do API Call
        var saveResponse = doAPICall();
    }).ConfigureAwait(false);
}).Unwrap();

task.Wait();

doAPICall() のコードは、Task を返す外部 API を呼び出す以下のようなものです。

private string doAPICall()
{
    Task<string> response = client.FindBags(request);
    response.Wait(60000);

    if (response.Status == TaskStatus.RanToCompletion)
    {
        return response.Result;
    }
}

doAPICall() 関数で、タスクの「応答」ステータスが RanToCompletion に変わらず、常に WaitingForActivation ステータスになるという問題が発生します。私はすでに待機タイムアウトを増やそうとしましたが、まだ運がありません。Task の代わりに TaskFactory を使用しているのは、将来、スケジューラと同時実行性をより詳細に制御するためにカスタム TaskFactory を作成したいからです。

内部タスクが実行されないコードに欠けているものはありますか?

編集 不要なスレッドを削除するというコメントに従って doAPICall() を呼び出すコードを変更しましたが、まだうまくいきません。:-(

var task = Task.Factory.StartNew(() =>
{
    // Do API Call
        var saveResponse = doAPICall();
});

task.Wait();
4

2 に答える 2

0

非同期呼び出しを同期呼び出しでラップし、次に 2 つの非同期呼び出しでラップしています。1 つの非同期呼び出しを使用するだけで問題ありません。

private Task<string> doAPICallAsync()
{
    return client.FindBags(request);
}

client.FindBags(request)このバージョンを使用した後に何らかの作業を行う必要がある場合:

private async Task<string> doAPICallAsync()
{
    var result = await client.FindBags(request);
    var someNewResult = //do something with result
    return someNewResult;
}

次に、次のように呼び出します。

var result = await doAPICallAsync();

本当に同期バージョンが必要な場合

private string doAPICall()
{
    return client.FindBags(request).Result;
}

そして、次のように呼び出します。

var result = doAPICall();

ConfigureAwait(false)可能であれば、待機するたびに追加することを忘れないでください。

于 2016-03-09T07:14:54.840 に答える