page contents

关于c#:Parallel.For中StringBuilder的线程安全

本文讲述了关于C#:Parallel.For中StringBuilder的线程安全!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2023-02-FMKTGWRW63f029a97543c.png

本文讲述了关于C#:Parallel.For中StringBuilder的线程安全!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

我创建了一个结构,例如AStruct,并覆盖了它的ToString()方法。 然后,我编写了一个并行函数以返回一些AStruct并将它们放在列表中,以便可以使用StreamWriter来输出它们,例如

 StreamWriter sw = new StreamWriter(@"ABC.txt");

StringBuilder sb = new StringBuilder();

List<AStruct> AList = new List<AStruct>();


Parallel.For(0,10,i =>                          // generate 10 AStruct(s)

{

   AList.Add(DoSomethingThatReturnsAStruct);

});


for(int i =0; i< AList.Count();i++)             //put in a StringBuilder

{

   sb.AppendLine(AList[i].ToString());

}

sw.Write(sb.ToString());

sw.Close(); 

问题在于输出文件仅打印7/8行AList,而AList实际上得到了所有10个元素。 我想知道这是否与StringBuilder的线程安全有关。 有人可以解释为什么不输出所有行吗?

 相关讨论

它不是Stringbuilder多数民众赞成在这里的问题,其List< T >多数民众赞成在并行操作。

@IanMercer不,不是,再次阅读他的问题,尤其是最后一段。 而AList实际上获得了所有10个元素。

@kchpchan 1,10在Parallel.For生成9个元素,而不是10个,做0.1或1,11

@CSharpie-可能在逐步调试时。 List < T >对于Add不是线程安全的。 首先解决。

该代码是否被try catch包围? 捕获通用异常还是ArgumentOutOfRange异常?

在上面的代码中,除了main线程(或正在创建sw的任何线程)以外的任何其他东西都不会访问/修改StringBuilder实例,因此StringBuilder的线程安全性无关紧要,但是您有一个 一个更大的错误,在处理多个线程时您应该永远记住。
Never ever modify a shared resource by multiple threads unless that
resource is thread-safe
您正在从不同的线程更新AList,因此可以使用lock来同步访问或使用线程安全的集合,例如 ConcurrentQueue(保证订购)或ConcurrentBag(不保证订购)
您还将在AList中添加9个条目,而不是10个。
最后,这里是您修改后的代码,可以产生预期的结果。
 var sw = new StreamWriter(@"ABC.txt");
try
{        
    var AList = new List<AStruct>();

    var locker = new object();
    Parallel.For(0, 10, i =>                          // generate 10 AStruct(s)
    {
        lock (locker) { AList.Add(new AStruct()); }
    });

    var sb = new StringBuilder();
    for (int i = 0; i < AList.Count; i++)             //put in a StringBuilder
    {
        sb.AppendLine(AList[i].ToString());
    }
    sw.Write(sb.ToString());
} finally
{
    sw.Close();

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg


  • 发表于 2023-02-18 09:28
  • 阅读 ( 294 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
王昭君
王昭君

209 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 1131 文章
  3. 小柒 1038 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章