如何让两个函数异步执行

问题描述

上代码,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

时间: 2024-10-26 15:03:28

如何让两个函数异步执行的相关文章

javascript-js点击某一个链接交替执行两个函数(js实现网页全屏问题)

问题描述 js点击某一个链接交替执行两个函数(js实现网页全屏问题) 想实现的需求:1.网页上有个"全屏显示"按钮(链接),点击全屏后执行函数fullScreen(),然后"显示全屏"二字变成"退出全屏":2.点击"退出全屏"执行函数exitFullScreen(),然后"退出全屏"变为"全屏显示" function fullScreen() { var el = document.do

浅析javascript异步执行函数导致的变量变化问题解决思路_javascript技巧

浅析javascript异步执行函数导致的变量变化问题解决思路 for(var i=0;i<3;i++) { setTimeout(function(){ console.log(i) },0); } 控制台输出: 3 3 3 这是因为执行方法的时候for循环已经执行完成每次执行的时候取得都是3 而不是1-2-3这时我们可以使用立即执行函数为每一次循环创建一个变量副本来供定时器调用解决这个问题 for (var i = 0; i < 3; i++) { setTimeout( (functio

ODBC中的同步与异步执行模式

1.引言 近年来,随着计算机局域网技术的不断发展,计算机体系结构已经发展到复杂而开放的客户机/服务器模式.对于客户机/服务器应用的开发,现在常用的前端开发工具有:VisualBasic.Delphi.PowerBuilder等.它们可通过ODBC接口访问服务器的SQLServer数据库服务器. VisualBasic.Delphi.PowerBuilder等开发工具在使用ODBC2.0来编写程序时,通常会提供三种方法来进行数据库应用程序的方案设计: ·使用数据控制项 ·使用数据库对象变量进行编程

浅谈js的异步执行_javascript技巧

1.Javascript语言的执行环境是"单线程"(single thread): 优点:实现起来比较简单,执行环境相对单纯: 缺点:只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行. 为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous). 2.&

javascript异步执行的一些例子

function a() { var n = 0; for(var i=1;i<10000000;i++) { n=i+n; } document.getElementById('a1').value=n; } function b() { document.getElementById("a2").value=22222; } a(); b(); 看上面的这两个函数,在执行的结果写入两个input时,肯定是a函数执行完毕后,再执行b函数,这就是单线程排队.如何异步执行这两个函数

PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkPHP框架(3.2) Redis数据库:测试数据回调函数:通过一个Redis的自增incr来测试异步脚本执行的次数和访问的时间(平时都是用Redis测试写日志的) 编辑器:Visual Studio Code (CLI运行环境好看点) PHP 的命令行模式       从版本 4.3.0 开始,PHP

class-[java]关于main函数的执行先后顺序

问题描述 [java]关于main函数的执行先后顺序 在这个文件在执行的时候先执行那个呢?,如果把InvolveMain类里的方法写成注释后面的又先执行哪个呢?求详细解释一下,谢谢谢谢. package exercise5;//整个文件的类名是E20//创建一个使用可变参数列表而不是普通的main()语法的main().//打印所产生的args数组的所有元素,并用各种不同数量的命令行参数来测试它class InvolveMain{ static void main(String...args){

PHP ajax 异步执行不等待执行结果的处理方法

  这篇文章主要介绍了PHP ajax 异步执行不等待执行结果的处理方法,本文直接给出实现代码,需要的朋友可以参考下 短地址生成应用中,要根据长地址生成网页快照,这个生成时间非瞬发,不可预估. 所以前台方面采用的方案一般为先展示生成的短地址,再定期AJAX轮查网页快照是否生成完毕. So,PHP代码这里做了如下处理: 代码如下: // 这边服务器采用的是phantomjs 来生成网页快照 $cd = '/home/emp/phpinstall/phantomjs-1.5.0/bin/phanto

PHP 异步执行方法,模拟多线程

PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式. 另外还有一种更简单的方式可用于 Web 程序中,那就是用 fsockopen().fputs() 来请求一个 URL, 而无需等待返回,如果你在那个被请求的页面(URL)中做些事情就相当于异步了. 关键代码如下: <?php $fp=fsockopen('localhost',80,&$errno,&$errstr,5); if(!$fp){ echo "$e