2016-11-04 1 views
3

は私のテストコードは次のとおりです。私はresult = index.ToString() + this.getresult().Result;を使用する場合はなぜ遅いです、私はここでは、asp.netのWEBAPIテストアプリケーションを作成する.NETタスクの巣サブタスク

、応答時間は2秒です。 Thread.Sleep(100); result = index.ToString();を使用すると、200msしか必要ありません。

public class HomeController : Controller 
{ 
    public string Test() 
    { 
     var listName = new List<int>(); 

     for (int i = 0; i < 100; i++) 
     { 
      listName.Add(i); 
     } 

     var response = Task.WhenAll(listName.Select(sendrequest)).Result; 

     return string.Join(",", response); 
    } 

    public async Task<string> sendrequest(int index) 
    { 
     return await Task.Factory.StartNew(() => 
     { 
      string result = string.Empty; 

      try 
      { 
       Thread.Sleep(100); result = index.ToString(); 
       //result = index.ToString() + this.getresult().Result; 
      } 
      catch (Exception ex) 
      { 
       System.IO.File.AppendAllText("D:\\WebService\\FelixTest\\log.txt",ex.ToString()); 
      } 

      return result; 

     }).ConfigureAwait(false); 
    } 

    public async Task<string> getresult() 
    { 
     await Task.Delay(100); 

     return "OK"; 
    } 
} 
+1

getresultメソッドの遅延を利用している可能性がありますか? – ThunD3eR

+0

どのようにタイミングを測定していますか?あなたの「遅延」はわずか100(ms)ですので、2秒かかるはずはありませんが、アプリの実行に要する時間をどのように測定しているかは分かりません。 – Shaamaan

答えて

2

あなたはThreadPoolのスレッドスターベーションに苦しんでいると思います。問題は、あなたがコメントアウトされている

//result = index.ToString() + this.getresult().Result; 

Task.Resultプロパティにアクセスすることによりラインにあり、あなたはgetresult()メソッドから返さTaskWaitを引き起こしています。待機操作は、現在のスレッドの実行をブロックします。つまり、次のタスクを別のスレッドなどでスケジュールする必要があります。 100のタスクをすべて開始すると、スレッドプールはその要求を満たすために新しいマネージスレッドを開始しようとしますが、これは時間のかかるプロセスです。

トップレベルのTestメソッドを除いて、すべてが非同期になるようにコードを再編成します。この例では、非同期待機パターンを使用しているため、タスクが(少なくとも部分的に)並列に実行されているので、なぜTask.Factory.StartNew()が必要なのかわかりません。実際の実例では、タスクをバックグラウンドスレッドでスケジューリングする必要がありますか?あなたはまだ同じことを達成することができますFactory.StartNew()使用する必要がありますが、あなたがStartNewに渡すデリゲートがあるべき場合

public async Task<string> sendrequest(int index) 
{ 
    string result = string.Empty; 
    try 
    { 
     result = index.ToString() + await this.getresult(); 
    } 
    catch (Exception ex) 
    { 
     System.IO.File.AppendAllText("D:\\WebService\\FelixTest\\log.txt",ex.ToString()); 
    } 

    return result; 
} 

- :あなたはFactory.StartNew()を使用する必要がない場合、私はこのようsendrequestを書き換えることをお勧めしたいですasyncと記されています。

+0

ありがとう、それは真実のように見えます。 –

1

あなたの説明によると、違いは1800ミリ秒です。 getresultに100ミリ秒の遅延があります。それを差し引くと、差は1700ミリ秒です。 "OK"で文字列を連結してもそのことは説明しません。その結果、おそらくループを使用し、getresultに100ミリ秒の遅延が大幅に増加します。

+0

こんにちは、私は質問を更新します。 thread.sleep(100)を追加すると、応答時間は200msになります。 –

+0

あなたのコードをデバッグすると、何回getresultを入力しますか? –

+0

100回、大丈夫です。 –

関連する問題