2017-02-03 7 views
2

以下は、複数のスレッドを開く新しいメソッドのパフォーマンスを向上させるコードですが、シングルスレッドで呼び出されるメソッドは優れたパフォーマンスを示します。複数のスレッドで実行されているメソッドのスケールパフォーマンスC#

だから、あなたは私ではなく、複数のスレッドで単一のスレッド上で実行される方法(すなわち、旧方式)を

 public List<CEntity> GetSomeFunction(Ent ent) 
    { 
     List<CEntity> lstCE = new List<CEntity>(); 
     this.objEnt = ent; 

     TestObj objTempBal = new objTempBal(); 
     objTempBal.objEnt = ent; 

     System.Diagnostics.Debug.WriteLine("new Method"); 

     Stopwatch stopWatch = new Stopwatch(); 
     stopWatch.Start(); 

     objTempBal.FetchSomeDataAsync(ent).Wait(); 

     stopWatch.Stop(); 

     System.Diagnostics.Debug.WriteLine(String.Format("Elapsed time: {0} -- {1} ", 
     stopWatch.Elapsed.Milliseconds, DateTime.Now)); 

     System.Diagnostics.Debug.WriteLine("old Method"); 

     Stopwatch stopWatch1 = new Stopwatch(); 
     stopWatch1.Start(); 

    List<CEntity> result = null; 
     ResponseApi response = null; 
     try 
     { 
      IWrapper Wrapper = InitializeWrapper(ent); 
      int pageNo = 1; 
      bool createPaging = true; 
      while (createPaging) 
      { 

       SearchCriteria objSC = new SearchCriteria() 
       { 
        //pageSize = this.pageSize, 
        pageSize = "1000", 
        page = pageNo.ToString() 
       }; 
       response = Wrapper.SomeSynchronusAPIMethod(objSC); 
       if (response.Success) 
       { 
        result = (List<CEntity>)response.results; 
        if (result.Count == 0) 
        { 
         createPaging = false; 
        } 
        else 
        { 
         result = result.ToList();       

        } 
        lstCE.AddRange(result); 

       } 
       else { createPaging = false; } 
       pageNo = pageNo + 1; 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 

     stopWatch1.Stop(); 
     System.Diagnostics.Debug.WriteLine(String.Format("Elapsed time: {0} -- {1} ", 
      stopWatch1.Elapsed.Milliseconds, DateTime.Now)); 
     return lstCE; 
    } 

public async Task<List<CEntity>> FetchSomeDataAsync(Ent ent) 
{ 

     var tasks = new List<Task<List<CEntity>>>(); 
     int pageCount = 18; 
     List<int> pages = new List<int>(); 

     for (int addItemToList = 1; addItemToList <= pageCount; addItemToList++) 
     { 
      pages.Add(addItemToList); 
     } 
     List<CEntity> resultRange = new List<CEntity>(); 
     foreach (var list in pages.Batch(10)) 
     { 

      foreach (var item in list) 
      { 
       IWrapper Wrapper1 = InitializeWrapper(ent); 
       tasks.Add(Task.Run(() => FetchSomeDataFromSynchronusAPI(Wrapper1, item))); 

      } 
      var results = await Task.WhenAll(tasks); 
      resultRange.AddRange(results.SelectMany(x => x.ToList()).ToList()); 
      tasks = new List<Task<List<CEntity>>>(); 
     } 
     return resultRange; 

} 

    public async Task<List<CEntity>> FetchSomeDataFromSynchronusAPI(IWrapper Wrapper, int pageNo) 
    { 
     System.Diagnostics.Debug.WriteLine("Start pageNo " + pageNo + " -- " + DateTime.Now); 

     List<CEntity> result = null; 
     ResponseApi response = null; 
     SearchCriteria objSC = new SearchCriteria() 
     { 

      pageSize = "1000", 
      page = pageNo.ToString() 
     }; 


     response = Wrapper.SomeSynchronusAPIMethod(objSC); 

     if (response.Success) 
     { 
      result = (List<CEntity>)response.results; 

      result = result.ToList(); 

     } 
     System.Diagnostics.Debug.WriteLine("End pageNo " + pageNo + " -- " + DateTime.Now); 

     return await Task.FromResult<List<CEntity>>(result); 
     //return (result); 
    } 
+0

Wrapper.SomeSynchronusAPIMethodはこの非同期メソッドですか? –

+0

Wrapper.SomeSynchronusAPIMethodは非同期メソッドではありません – Ashutosh

答えて

2

不要に実行され、新たな方法のための時間を最小化する方法を教えてください可能性があり各バッチを待ちます。すべてのタスクを実行し、page.Batchループの外側をすべて待つとき。

  List<CEntity> resultRange = new List<CEntity>(); 

      foreach (var list in pages.Batch(10)) 
      { 

       foreach (var item in list) 
       { 
        IWrapper Wrapper1 = InitializeWrapper(ent); 
        tasks.Add(Task.Run(() => FetchSomeDataFromSynchronusAPI(Wrapper1, item))); 

       } 
      } 

     var results = await Task.WhenAll(tasks); 
     resultRange.AddRange(results.SelectMany(x => x.ToList()).ToList()); 
+0

各バッチを待つ必要がない場合、resultrangeに結果を追加する方法 – Ashutosh

+0

私は今答えを編集しましたvar results = await Task.WhenAll(tasks);ループ外に移動されるので、タスクリストにはすべてのページのすべてのタスクが含まれます。結果変数にはすべてのタスク結果が含まれます。最後の行はすべての結果を処理し、resultrangeに追加します。 –

+0

しかし、これはすべてのページのすべてのスレッドを一度に開く欠陥で、サーバのパフォーマンスが低下します。 100ページがある場合、サーバー上には100スレッドが開きます。だから私の必要条件はバッチでスレッドを処理することです。つまり、10個のスレッドと10個のスレッドのバッチを実行します。 – Ashutosh

関連する問題