相同方法的多线程

我试图获取100000字符串输出并尝试使用多个线程来实现,但是在检查最终结果字符串时,它只有10000行。


这里=>


  string result = "";


   private void Testing()

            {  

 var threadA = new Thread(() => { result += A()+Environment.NewLine; });

                var threadB = new Thread(() => { result += A() + Environment.NewLine; });

                var threadC = new Thread(() => { result += A() + Environment.NewLine; });

                var threadD = new Thread(() => { result += A() + Environment.NewLine; });

                var threadE = new Thread(() => { result += A() + Environment.NewLine; });

                var threadF = new Thread(() => { result += A() + Environment.NewLine; });

                var threadG = new Thread(() => { result += A() + Environment.NewLine; });

                var threadH = new Thread(() => { result += A() + Environment.NewLine; });

                var threadI = new Thread(() => { result += A() + Environment.NewLine; });

                var threadJ = new Thread(() => { result += A()+Environment.NewLine; });


                threadA.Start();

                threadB.Start();

                threadC.Start();

                threadD.Start();

                threadE.Start();

                threadF.Start();

                threadG.Start();

                threadH.Start();

                threadI.Start();

                threadJ.Start();


                threadA.Join();

                threadB.Join();

                threadC.Join();

                threadD.Join();

                threadE.Join();

                threadF.Join();

                threadG.Join();

                threadH.Join();

                threadI.Join();

                threadJ.Join();

    }


private string A()

        {

            for (int i = 0; i <= 10000; i++)

            {

                result += "select * from testing" + Environment.NewLine;

            }

            return result;

        }

但是我得不到100000,我只得到10000。请让我知道为什么?


哔哔one
浏览 164回答 2
2回答

翻翻过去那场雪

正如我在评论中所解释的,A()不是线程安全的。如果将其可视result += value;化为result = result+ value;,则可以看到在单个线程获取结果并将其写回之前,另一个线程有可能获取(现在)旧值。您应该在局部变量中构建每个线程的贡献(我将其更改为,StringBuilder因为它比字符串连接更有效),然后同步上下文并更新结果对象:private readonly object _resultLock = new object();&nbsp; &nbsp;&nbsp;private void A(){&nbsp; &nbsp; var lines = new StringBuilder();&nbsp; &nbsp; for (int i = 0; i <= 10000; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; lines.AppendLine("select * from testing");&nbsp; &nbsp; }&nbsp; &nbsp; lock (_resultLock)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; result += lines.ToString();&nbsp; &nbsp; }}由于您已经在类范围中有了一个名为“结果”的变量,因此我将A()更改为void。最好尽可能少地锁定,因为线程将不得不等待获取锁定。我们使用_resultLock以便知道该锁是用于的。您可以lock在文档中以及有关此问题的更多信息。您可能还想研究一下任务:docs,Task vs Thread问题。
打开App,查看更多内容
随时随地看视频慕课网APP