2014-01-28 51 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