【问题标题】:StringBuilder doesn't Append in nested Task.Factory [duplicate]StringBuilder 不会附加到嵌套的 Task.Factory [重复]
【发布时间】:2014-01-28 06:29:06
【问题描述】:

我的方法返回一个StringBuilder 并传入一个List<string> 的url。 我相信家长会等到孩子完成。

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

【问题讨论】:

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


    【解决方案1】:

    在循环内部,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

    【讨论】:

    • 请以我的代码为例说明如何锁定
    • 我决定走另一条路。我将发布我的解决方案。
    • 在检查您添加了 .Result 之后,这对我也有用。由于我们在同一页面上,我仍然会为您提供解决方案。谢谢。
    猜你喜欢
    • 2013-09-30
    • 2012-11-25
    • 2021-05-03
    • 2023-03-06
    • 2018-09-22
    • 1970-01-01
    • 2011-12-31
    • 2013-02-10
    • 2015-03-18
    相关资源
    最近更新 更多