问题描述
上代码,produceData不断产生新的数据,Method函数用来消耗计算;如何保证Method1和Method2消耗数据时是异步的,互不影响?classProgram{staticvoidMethod1(intn){Console.WriteLine(n+",调用Method1");Thread.Sleep(1000);}staticvoidMethod2(intn){Console.WriteLine(n+",调用Method2");Thread.Sleep(3000);}staticvoidMain(string[]args){produceData();System.Console.ReadKey();}///<summary>///不断产生数据///</summary>staticvoidproduceData(){while(true){intx=newRandom().Next(100,200);Method1(x);//如何让Method1和Method2是异步执行的,执行Method1时不能堵塞Method2;即Method1打印字符速度是Method2的3倍Method2(x);Thread.Sleep(1000);}}}
解决方案
解决方案二:
所谓“生产者-消费者模式”本来就是比较垃圾的简单概念,“异步”严格来说其实也不是这个意思的,而且你弄一个“while循环+Sleep(1000)阻塞”这即是最典型的低效和浪费程序,而且对于一个简单的int数值干嘛要付出多线程windows调度的成本?在.net中,线程是很容易编程的。例如可以使用系统线程池来自动优化地注册一段代码ThreadPool.QueueUserWorkItem(h=>执行你的方法());
解决方案三:
Task执行下不就行了
解决方案四:
严格来说“异步”根本不是你立即的那个意思,异步跟多线程没有必然的联系。例如你编写一个”推箱子“游戏程序,你设计为小人移动时可以触发一个事件(例如播放某个2秒钟的声音),这个事件可能是在主线程中触发的、也可能是在子线程中触发的;可能是小人移动时立刻触发的,也可能是在有游戏处理完所有用户操作之后才触发的。异步的意思就是”回调“,就是基本的依赖倒置的面向对象设计模式的体现。但是它跟”并发多线程“并不是同一个概念,不能任意替换。
解决方案五:
楼主不过是想用produceData去模拟一下真实的信号源而已
解决方案六:
publicdelegatevoidAddHandler(inta);staticvoidMethod1(intn){for(inti=0;i<100;i++){//显示执行该方法的线程IDConsole.WriteLine("调用Method1的线程ID为:{0}",Thread.CurrentThread.ManagedThreadId);Thread.Sleep(1000);}}staticvoidMethod2(intn){for(inti=0;i<100;i++){//显示执行该方法的线程IDConsole.WriteLine("调用Method2的线程ID为:{0}",Thread.CurrentThread.ManagedThreadId);Thread.Sleep(3000);}}staticvoidMain(string[]args){produceData();System.Console.ReadKey();}///<summary>///不断产生数据///</summary>staticvoidproduceData(){//异步操作返回while(true){intx=newRandom().Next(100,200);newAddHandler(Method1).BeginInvoke(x,null,null);newAddHandler(Method2).BeginInvoke(x,null,null);//newThread(()=>{Method1(x);}).Start();//如何让Method1和Method2是异步执行的,执行Method1时不能堵塞Method2//newThread(()=>{Method2(x);}).Start();Thread.Sleep(10000);}}
异步的现实方式我之前使用的是开线程:newThread(()=>{Method2(x);}).Start();显然异步更好些觉得。Task是否更好呢?数据流非常大那个方法更优呢?
解决方案七:
@sp1234不想纠结具体的概念,只想知道这个场景下什么方式效果是最佳的
解决方案八:
引用楼主shsyzl007的回复:
上代码,produceData不断产生新的数据,Method函数用来消耗计算;如何保证Method1和Method2消耗数据时是异步的,互不影响?classProgram{staticvoidMethod1(intn){Console.WriteLine(n+",调用Method1");Thread.Sleep(1000);}staticvoidMethod2(intn){Console.WriteLine(n+",调用Method2");Thread.Sleep(3000);}staticvoidMain(string[]args){produceData();System.Console.ReadKey();}///<summary>///不断产生数据///</summary>staticvoidproduceData(){while(true){intx=newRandom().Next(100,200);Method1(x);//如何让Method1和Method2是异步执行的,执行Method1时不能堵塞Method2;即Method1打印字符速度是Method2的3倍Method2(x);Thread.Sleep(1000);}}}
生产数据写入buffer(或者线程安全的容器)另外一个线程来读取buffer就实现最简单的异步了
解决方案九:
异步是并行的,相互之间影响
解决方案十:
ThreadPool.QueueUserWorkItem(h=>执行你的方法());
正解..什么年代了还自己在那newThread