问题描述
我现在开始公开几天前已经写好的答案。我最初考试大家的对这些问题的分析能力。可是我看到的结果看出,一些基本的多线程的RnunSynchronous方法的运行机制也根本不懂。如果,真的掌握不可能不懂返回结果应该是多少这样的具体数据。让我感叹的是这种不懂基本技术的人一大堆的人,让更多的人参与回答,可能出现更多的人犯错误。但是我这个帖子之后不再发帖讲课了,不懂礼貌的人太多了。根本不懂知识的人却反而要教人,我看了这种人太多了。这些人有个特点,比自己的技术分低锝很大差异的人,错误以为,这些人是不如自己的技术和掌握知识。我的博客地址http://blog.csdn.net/office_2007/article/details/40861655这里有答案,以后避免不该发生的错误,也不要做害人害己的代码。
解决方案
解决方案二:
没什么用...
解决方案三:
如下程序返回2,应该返回3,程序如下:intx=1+1;
然后人家问题:“你是根据什么说x应该为3呢?根据呢?”,你就大骂人家什么都不懂了,没有顺着你的话说了,“驴唇不对马嘴”了。^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^你就是上述这样以非常人的“语文素养和逻辑方式”方式去描述你的原始问题的。然后标榜自己首次在csdn上发这样的帖的目的,就是为了考试大家、来讲课。唉
解决方案四:
这里,在你连续5个述说别人“不懂”只后,你写了一句“这些人有个特点,比自己的技术分低锝很大差异的人,错误以为,这些人是不如自己的技术和掌握知识。”我告诉你,其实这是你自己的心理在作怪。分数低就“代表着技术不如自己”,这是你自己编出来的话,因为论坛上能够有这么多人、这么长时间,正常人应该可以想象到它一定是崇尚交流的,而不是什么先来后到。你先编出一个谎话,然后来扇嘴巴,这是因为你心里暗自有这个悲催的想法。
解决方案五:
LZ离能以上课/考试的形式给别人讲解多线程还差很远。大部分人是在自己掌握了乘法以后给别人讲讲加法,和别人讨论乘法问题也是谦虚的态度提供建议。你是觉得自己学会了加法就能给别人上课/考试,还幻想着别人应该“懂礼貌”,我只能说呵呵,勇气可嘉。
解决方案六:
这次只围观不接分了,上次被删了等争完了谁给个完整的讲解好了
解决方案七:
如下程序应该返回3,实则返回4inta=2;intb=a;intc=a+b;returnc;
原因是b错误的使用了a的值,改成如下inta=2;intb=1;intc=a+b;returnc;
则返回结果正常
解决方案八:
如下程序应该返回300万,实则返回400万strings="300万";
解决方案九:
粗略的看了一下,感觉不会是300W
解决方案十:
引用5楼zeratul1990的回复:
这次只围观不接分了,上次被删了等争完了谁给个完整的讲解好了
有觉悟了
解决方案十一:
引用9楼weimochengxi的回复:
Quote: 引用5楼zeratul1990的回复:
这次只围观不接分了,上次被删了等争完了谁给个完整的讲解好了有觉悟了
反正现在积分等级改了,用不着想办法摆脱小绿三角了分多分少都无所谓了
解决方案十二:
多线程不是象你说的这么难搞吧.1.弄清该并行还是串行.2.用线程安全变量.3.线程间如何传递参数及返回.这三点基本足够了....还能生出其它的么?
解决方案十三:
引用6楼Z65443344的回复:
如下程序应该返回3,实则返回4inta=2;intb=a;intc=a+b;returnc;原因是b错误的使用了a的值,改成如下inta=2;intb=1;intc=a+b;returnc;
则返回结果正常
你和上面几个人仍然还是执迷不悟,连自己的错误也发现不了!。可悲啊再次,看愿发帖的代码。如下程序同步运行后返回不正确,应该返回300万,实际返回了400万。ImportsSystem.Collections.ConcurrentPublicClassClass1PrivateConCurrentBag1AsNewConcurrentBag(OfInteger)'在这里创建ConcurrentBag,运行结果发生错误。SubMySub()DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()Task2.RunSynchronously()DimList1AsNewList(OfInteger)List1.AddRange(Task1.Result)List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsConcurrentBag(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1EndFunctionEndClass
再次看上面代码中的RunSynchronously()方法,我请你们用自己的大脑计算两个RunSynchronously()方法之下应该返回多少的数据问题。如果,弄不清RunSynchronously()方法运行机制,不会得到正确的返回数据。我已经提前告诉应该返回300万,实际返回400万了。我在博客中已经具体说明了答案和导致错误的原因。另外,阐述了几个方法来避免错误。请看如下代码;请与上面的代码对比一下,会发现只该变了List1.AddRange(Task1.Result)接收数据顺序。结果又正确返回了300万。ImportsSystem.Collections.ConcurrentPublicClassClass1PrivateConCurrentBag1AsNewConcurrentBag(OfInteger)'在这里创建ConcurrentBag,运行结果发生错误。SubMySub()DimList1AsNewList(OfInteger)DimTask1AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfConcurrentBag(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()List1.AddRange(Task1.Result)Task2.RunSynchronously()List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsConcurrentBag(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1EndFunctionEndClass
请看如下代码;另一种方式是设法断开引用类型的引用。只改变了ConCurrentBag1.之后面加上了ToList,返回List类列表。结果正确返回了300万。[code=vb]ImportsSystem.Collections.ConcurrentPublicClassClass1DimConCurrentBag1AsNewConcurrentBag(OfInteger)SubMySub()DimTask1AsNewTask(OfList(OfInteger))(AddressOfMyFunc)DimTask2AsNewTask(OfList(OfInteger))(AddressOfMyFunc)Task1.RunSynchronously()Task2.RunSynchronously()DimList1AsNewList(OfInteger)List1.AddRange(Task1.Result)List1.AddRange(Task2.Result)MsgBox(List1.Count)EndSubFunctionMyFunc()AsList(OfInteger)'DimConCurrentBag1AsNewConcurrentBag(OfInteger)Forindex1AsInteger=1To1000000ConCurrentBag1.Add(index1)NextReturnConCurrentBag1.ToListEndFunctionEndClass[code]还有存在另一种解决方案,你们都能写出来吗?上面几个爱出风头的几个人如果有本事下面回复中写出来吧。我只认代码,我i不承认无操作性的瞎编言论。