StringBuilder不会嵌套在嵌套的Task.Factory中

时间:2014-01-28 06:29:07

标签: c# .net concurrency task-parallel-library multitasking

我的方法返回StringBuilder并传入List<string>个网址。 我相信父母会等到孩子完成。

但是这个方法在完成之前似乎已经退出了,因为调用者有一个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;

1 个答案:

答案 0 :(得分:0)

在循环内部,GetStringAsync到该位代码的本地字符串var。当你有字符串时,在执行追加时锁定StringBuilder。

未经考验的例子,我不是为你做的全部。 :)

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

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

有关详细信息,请参阅here

相关问题