2017-10-19 104 views
0

我陷入了這個問題。我有一個API,我必須在循環中多次調用它。獲取IList中所有迭代的API響應。我必須對該IList執行一些操作。我正在循環調用我的API。所以假設有5次迭代循環。每當一次命中API時,它都會等待響應,然後再響應另一個響應。我想在線程中編寫這些調用。在最後得到所有線程的響應。然後根據我的業務邏輯來處理這個響應。C#調用api使用線程調用api循環通過

我的虛擬代碼就像。

    foreach (.....) 
        { 
         //want to open thread here 
         mylist.Add(CalltoAPI(Params)); 
        } 
       //want to wait for all thread to be closed. 
        PerformBusinessLogic(mylist); 
+1

這個問題太廣泛了...請進一步描述api調用的行爲,比如這是一個web調用,它的平均持續時間等。 – Leonardo

+0

這正是微軟的Reactive Framework設計的做。您將最終得到如下查詢:從Observable.Start(()=> PerformBusinessLogic(x,)中的z從Observable.Start(()=> CalltoAPI(x))中的y從mylist.ToObservable() y))選擇z'。這都是多線程的。好的一點是,當你訂閱查詢時,你可以在生成時返回值,而不是在最後。它非常乾淨。 – Enigmativity

+0

@Leonardo - 爲什麼這太寬泛?擁有適當的簽名等會很好,但對我來說這似乎是一個簡單的場景。我已投票重新開放。 – Enigmativity

回答

1

你是在正確的軌道上:

您創建的任務列表和添加。然後你可以等他們。

var mylist = new List<Task>; 
foreach (.....) 
{ 
    //want to open thread here 
    mylist.Add(CalltoAPIAsync(Params)); <== this should be an async task method 
} 
await Task.WhenAll(myList); 

然後你可以迭代你的任務。

給它一個去吧!

編輯:碼位完成者:

public async Task DoSomething() 
    { 
     var ids = Enumerable.Range(1, 5); 
     var myList = new List<Task<string>>(); 
     foreach (var id in ids) 
     { 
      myList.Add(CallApiAsync(id.ToString())); 
     } 
     await Task.WhenAll(myList); 

     foreach (var task in myList) 
     { 
      Console.WriteLine(task.Result); 
     } 
    } 


    public Task<string> CallApi(string id) 
    { 
     return Task.Run(() => id); 
    } 

不能確定task.Result,我的頭戴式的,但你的想法:)

1

這是很難在這裏找到最佳答案因爲它很大程度上取決於調用者應用程序類型(控制檯,asp.net,winform,...)的最大迭代次數,被調用API的性能等特定細節...

總而言之,並行(多線程)編程是棘手的,我會建議深入研究它。

不過,鑑於給我推薦這個信息量:

var myConcurentlist = new ConcurentBag<CallToApiReturnType>(); 
Parallel.ForEach(allApiCallsArgs, (oneApiCallArgs) => 
{ 
    myConcurentlist.Add(CalltoAPI(Params)); 
}); 
mylist = myConcurentlist.ToList(); 

請注意,您不得與MYLIST直接作爲List是不安全的從多個線程同時使用工作中所說明的例子在這裏Can a List<t> be accessed by multiple threads?