一个线程的值影响另一个线程的路径我有一个程序使用两个客户端线程和一个服务器。在我的程序中的某个时刻,我希望一个线程中的值影响另一个线程中的路径。更具体地说,我在服务器中有这段代码:stringendGameTrigger=string.Empty;//设置streamReaders和streamWriterswhile(true)//无限游戏循环{//读入一个问题并发送到两个线程。pAnswer=sr.ReadLine();控制台.WriteLine(pAnswer);奖励积分();writeToConsole("按ENTER键问另一个问题或输入0结束游戏",isFirstThread);如果(isFirstThread==真){endGameTrigger=Console.ReadLine();//这只是分配给一个线程...}barrier.SignalAndWait();if(endGameTrigger=="0")//...意味着这在一个线程中永远不会满足{endGame();}}}}布尔值isFirstThread是在线程的构造函数中设置的值,我可以检测到哪个线程首先连接到线程。是否有某种方法,或者可能是一种线程方法,允许第二个连接的线程检测到第一个线程中的endGameTrigger已设置,因此两个线程都正确执行endGame()方法。最好专注于多线程,但要谨慎行事。多线程的不正确使用/处理会导致不可预测和不一致的代码行为。有些事情大部分时间都有效,然后就无效了。错误很难重现和识别。也就是说,处理多线程的一个基本概念是确保两个线程不会同时尝试更新相同的值。它们可能会以单线程无法实现的方式破坏或部分修改值。实现此目的的一种方法是使用锁定。私有对象_lockObject=newObject();私有字符串_myString;voidSetStringValue(stringnewValue){lock(_lockObject){_myString=newValue;你通常只有一个对象存在并且只能用作锁。当一个线程进入锁块时,它就获得了对象的锁。如果另一个线程已经锁定了该对象,则下一个线程只是等待前一个线程释放锁。这样可以确保两个线程不能同时更新值。您想尽可能减少锁的代码量,以便尽快释放锁。请注意,如果它因多个锁而变得复杂,那么两个线程可能会永远阻塞对方。对于递增和更新数字,还有互锁操作为您处理锁定,确保这些操作一次由一个线程执行。为了好玩,我编写了这个控制台应用程序。它需要一个句子,将其分解成单词,然后使用多个线程将每个单词添加回一个新字符串并输出该字符串。使用系统;使用System.Threading.Tasks;namespaceFunWithThreading{classProgram{staticvoidMain(string[]args){varsentence="我要将这些单词中的每一个添加到一个字符串中"+"使用多个线程只是为了看看会发生什么。";varwords=sentence.Split('');可变输出=“”;Parallel.ForEach(words,word=>output=output+""+word);控制台.WriteLine(输出);控制台.ReadLine();}}}前两次我运行它,输出字符串正是我开始的。太好了,它完美无缺!然后我得到了这个:我将使用多个线程将这些单词添加到一个字符串中,只是为了看看会发生什么。each然后我跑了20+次都不能重复报错。想象一下,如果这是一个真正的应用程序,并且这样的事情不可预测地发生了,即使我一遍又一遍地测试它,然后我也无法让它再次发生。所以重点不是说多线程是邪恶的,只是了解其中的风险,只有在需要的时候才引入,然后仔细思考如何防止线程相互干扰。回应Luaan的评论。我已将endGameTrigger作为私有静态字符串endGameTrigger放入Handler类中。使它成为静态字段而不是局部方法变量允许处理程序类的所有实例(每个线程)访问该变量的最新分配。太感谢了。以上就是C#学习教程的全部内容:从一个线程的值共享影响另一个线程的路径。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
