2014-01-28 100 views
0

我的方法返回StringBuilder並通過List<string> URL。 我相信父母會等到孩子完成。StringBuilder不嵌入嵌套Task.Factory

但是看起來這種方法在完成之前就退出了,因爲調用者彈出了一個Messagebox,我的Debug.WriteLine(count);仍然在調試窗口中計數。

我的主要問題是:
結果StringBuilder對象沒有像循環後應該附加的那樣多。 StringBuilder是否可能通過使用Task重置?

int count = 1; 

StringBuilder result = new StringBuilder(); 

var parent = Task.Factory.StartNew(() => 
{ 
    foreach (string url in pURI) 
    { 
     try 
     { 
      var child = Task.Factory.StartNew(() => 
      { 
       using (HttpClient client = new HttpClient()) 
       { 
        result.Append(client.GetStringAsync(url).Result.ToLower()); 
        Debug.WriteLine(count); 
        count++; 
       } 
      }, TaskCreationOptions.AttachedToParent); 
     } 
     catch (Exception cancelException) 
     { 
      MessageBox.Show(cancelException.Message); 
     } 

     Debug.WriteLine(url.ToString()); 
    } 
}); 

parent.Wait(); 

return result; 

回答

0

在循環內部,GetStringAsync爲一個字符串var local代碼。當你有字符串時,在執行追加時鎖定StringBuilder。

未經檢驗的例子,因爲我沒有爲你做這一切。 :)

using (HttpClient client = new HttpClient()) 
{ 
    string s = client.GetStringAsync(url).Result.ToLower(); 
    lock(result) 
    { 
     result.Append(s); 
    } 

    Debug.WriteLine(count); 
    count++; 
} 

欲瞭解更多信息,請參閱here

+0

請舉例說明如何使用我的代碼鎖定 – Mike

+0

添加示例代碼。 –

+0

我決定去另一條路線。我會發布我的解決方案。 – Mike