2

次の状況について何か提案が必要です。API1 と API2 という 2 つの API があります。API1 は API2 からメソッドを呼び出します。API1 が API2 に接続できない場合があります。しかし、API2 に接続できない場合、API1 は 3 回試行していました。3 回後も API1 が API2 に接続できない場合は、1 分間の遅延を追加して再試行することにしました。API1 は、この 1 分間の遅延処理結果に依存してはなりません。「結果についてはメールを確認してください」などの応答をユーザーに返す必要があります。このために、私たちは試しました

TPL(タスク並列ライブラリ)

TPL を使用している間、API1 はタスクの完了を待機し、それからのみ結果を返します。

ねじ切り

スレッドプールを試しましたが、時代遅れです。

.NET フレームワーク 4.0

ここで、API1 のコードは TPL を実装します

 public string TestTPL()
    {
        string str = string.Empty;
        int i = 1;
        ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
        while (i <= 3)
        {
            //call a method resides in API2
            string str = obj.API2Method();
            if (string.IsNullOrEmpty(str))
                i++;
            else
                break;
        }
        if (string.IsNullOrEmpty(str))
            Parallel.Invoke(() => DoSomeWork());
        return "Hey, I came";
    }

    public void DoSomeWork()
    {
        //wait for 1 min
        System.Threading.Thread.Sleep(60000);
        ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
        //call a method resides in API2
        string str = obj.API2Method();
       //send mail to the user 

    }
4

3 に答える 3

0

Parallel.Invoke() は同期呼び出しです。つまり、すべての子が完了するまで戻りません。この場合、DoSomWork() が完了するまで待機します。

それ以外の

if (string.IsNullOrEmpty(str))
            Parallel.Invoke(() => DoSomeWork());

次のようなものを試してください

if (string.IsNullOrEmpty(str))
             Task.Run(() => DoSomeWork());

これはすぐに戻り、スレッド プールのスレッドで DoSomeWork() を実行します。

スレッドプールは古いですが、それでも優れたツールです。TPL は、カバーの下でどのように行われているかではなく、より高いレベルで行われている作業を表現するためのより良いセマンティクスを提供します。

于 2013-10-06T22:57:54.153 に答える