c# 异步c 多线程 异步操作

C#多线程等待的问题
[问题点数:50分,结帖人ap0405140]
C#多线程等待的问题
[问题点数:50分,结帖人ap0405140]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年4月荣获微软MVP荣誉称号2015年4月荣获微软MVP称号2014年4月 荣获微软MVP称号
2016年7月 MS-SQL Server大版内专家分月排行榜第一
2017年3月 .NET技术大版内专家分月排行榜第三2017年2月 .NET技术大版内专家分月排行榜第三2016年9月 .NET技术大版内专家分月排行榜第三2016年8月 .NET技术大版内专家分月排行榜第三2016年7月 .NET技术大版内专家分月排行榜第三2016年3月 .NET技术大版内专家分月排行榜第三2016年1月 .NET技术大版内专家分月排行榜第三2015年12月 .NET技术大版内专家分月排行榜第三2015年11月 .NET技术大版内专家分月排行榜第三
2017年2月 总版技术专家分月排行榜第三
2018年1月 .NET技术大版内专家分月排行榜第一2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2018年1月 .NET技术大版内专家分月排行榜第一2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2016年4月荣获微软MVP荣誉称号2015年4月荣获微软MVP称号2014年4月 荣获微软MVP称号
2016年7月 MS-SQL Server大版内专家分月排行榜第一
匿名用户不能发表回复!|C#多线程、跨线程与线程安全的示例详解-阿里云资讯网
C#多线程、跨线程与线程安全的示例详解
发布时间:
更新时间:
来源:网络
上传者:用户
C#多线程、跨线程与线程安全的示例详解(三种不同方法) &代码如下
using System.T public static class Extensions &&& { &&&&&&& //控件扩展方法(用于跨线程操作),因为为了线程的安全,防止资源竞争出现死锁或不一致的状态,.NET是不允许进行跨线程访问窗体控件的。 &&&&&&& public static void SafeCall(this Control ctrl, Action callback) &&&&&&& { &&&&&&&&&&& if (ctrl.InvokeRequired) &&&&&&&&&&& { &&&&&&&&&&&&&&& ctrl.Invoke(callback); &&&&&&&&&&& } &&&&&&&&&&& else &&&&&&&&&&& { &&&&&&&&&&&&&&& callback(); &&&&&&&&&&& } &&&&&&& } &&& } & &&& public partial class Form1 : Form &&& { &&&&&&& public Form1() &&&&&&& { &&&&&&&&&&& InitializeComponent(); &&&&&&&&&&& CheckForIllegalCrossThreadCalls =//方法二(禁用异常,不检查跨线程调用的安全问题,可以自由拖动窗体,不过在严格条件下也不可取,数据可能不一致) & &&&&&&&&&&& //方法三(推荐使用) &&&&&&&&&&& //把你要保护起来的代码作为一个回调,然后任何需要保护一些代码的地方都可以这样调用 &&&&&&&&&&& ThreadPool.QueueUserWorkItem(h =& &&&&&&&&&&& { &&&&&&&&&&&&&&& int i = 0; &&&&&&&&&&&&&&& while (true) &&&&&&&&&&&&&&& { &&&&&&&&&&&&&&&&&&& //如果没有SafeCall方法,将出现“线程间操作无效: 从不是创建控件“textBox1”的线程访问它。”的错误 & &&&&&&&&&&&&&&&&&&& ////匿名委托 &&&&&&&&&&&&&&&&&&& //textBox1.SafeCall(delegate() &&&&&&&&&&&&&&&&&&& //{ &&&&&&&&&&&&&&&&&&& //&&& textBox1.Text = (i++).ToString(); &&&&&&&&&&&&&&&&&&& //}); &&&&&&&&&&&&&&&&&&& //Lambda表达式 &&&&&&&&&&&&&&&&&&& textBox1.SafeCall(() =& &&&&&&&&&&&&&&&&&&& { &&&&&&&&&&&&&&&&&&&&&&& textBox1.Text = (i++).ToString(); &&&&&&&&&&&&&&&&&&& }); &&&&&&&&&&&&&&&&&&& //Thread.Sleep(100); &&&&&&&&&&&&&&& } &&&&&&&&&&& }); &&&&&&& } & &&&&&&& //抽奖示例 &&&&&&& public bool flag = &&&&&&& public void choujiang() &&&&&&& { &&&&&&&&&&& flag = &&&&&&&&&&& while (flag) &&&&&&&&&&& { &&&&&&&&&&&&&&& Random rnd = new Random(); &&&&&&&&&&&&&&& textBox1.Text = rnd.Next(1, 100).ToString(); &&&&&&&&&&&&&&& //Application.DoEvents();//方法一:这样也可以防止UI界面线程的阻塞,不至于被卡死。但是在拖动界面或其他操作的时候,程序会被暂停 &&&&&&&&&&& } &&&&&&& } &&&&&&& //开始 &&&&&&& private void button1_Click(object sender, EventArgs e) &&&&&&& { &&&&&&&&&&& //choujiang();//方法一 &&&&&&&&&&& new Action(choujiang).BeginInvoke(null, null);//方法二 &&&&&&& } &&&&&&& //暂停 &&&&&&& private void button2_Click(object sender, EventArgs e) &&&&&&& { &&&&&&&&&&& flag = &&&&&&& } &&& }
& 异步线程池 &代码如下
delegate double weituo(double d); &&&&&&& static weituo w = new weituo(perimeter); &&&&&&& /// &summary& &&&&&&& /// 计算周长 &&&&&&& /// &/summary& &&&&&&& /// &param name=&d&&&/param& &&&&&&& public static double perimeter(double d) &&&&&&& { &&&&&&&&&&& return d * Math.PI; &&&&&&& } &&&&&&& /// &summary& &&&&&&& /// 异步完成后回调的方法 &&&&&&& /// &/summary& &&&&&&& /// &param name=&result&&&/param& &&&&&&& public static void method(IAsyncResult result) &&&&&&& { &&&&&&&&&&& Console.Write(&hi~&); &&&&&&&&&&& Console.WriteLine(w.EndInvoke(result)); &&&&&&& }
&&&&&&& static void Main(string[] args) &&&&&&& { &&&&&&&&&&& //开始异步执行 &&&&&&&&&&& w.BeginInvoke(10, new AsyncCallback(method), null); &&&&&&&&&&& w.BeginInvoke(20, new AsyncCallback(method), null); &&&&&&&&&&& Console.Read(); &&&&&&& }
_________________________________ /// &summary& &&&&&&& /// 静态方法不需要实例化 &&&&&&& /// &/summary& &&&&&&& /// &param name=&d&&&/param& &&&&&&& public static void perimeter(object d) &&&&&&& { &&&&&&&&&&& Console.WriteLine(Math.PI * (double)d); &&&&&&&&&&& Thread.Sleep(1000); &&&&&&& } &&&&&&& static void Main(string[] args) &&&&&&& { &&&&&&&&&&& int i = 1; &&&&&&&&&&& WaitCallback wcb = new WaitCallback(perimeter); &&&&&&&&&&& while (i & 15) &&&&&&&&&&& { &&&&&&&&&&&&&&& //将任务排入队列以便执行,您的回调方法将在某个线程池线程可用时执行 &&&&&&&&&&&&&&& ThreadPool.QueueUserWorkItem(wcb, (double)i); &&&&&&&&&&&&&&& ++i; &&&&&&&&&&& } &&&&&&&&&&& Console.Read(); &&&&&&& }
优点: &使用线程可以把占据长时间的程序中的任务放到后台去处理 &用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 &程序的运行速度可能加快 &在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
缺点: &如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换; &更多的线程需要更多的内存空间 &线程会给程序带来更多的bug,因此要小心使用 &线程的中止需要考虑其对程序运行的影响 &通常块模型数据是在多个线程间共享的,需要一个合适的锁系统替换掉数据共享
本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:zixun-group@service.aliyun.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。
在命令行模式下: % 当前完整的文件名 %:h 文件名的头部,即文件目录.例如../path/test.c就会为../path %:t 文件名的尾部.例如../path/test.c就会为test.c %:r 无扩展名的文件名.例如../path/test就会成为test %:e 扩展名 %&&& 当前文件名 %:h&&& 文件名...
最近开始捡起C语音来看,《c语言实用基础》,一边看一边做例子学习。然后发现,每次写完一个例子后,都要写几个字符,去编译并执行一下,然后就想看看能不能利用vim的map映射,把这种常规性的命令绑定到一个快捷键上去,查了一些资料后,果真是可以实现的。 先摆出来怎么用的。 打开~/.vimrc文件,并在最后以后之后粘贴上一下代码: Example &代码如下 &映射命令行下的c...
Session过期
我们知道WEB服务器的Session是与客户端浏览器线程关联的,如果用户关闭了浏览器,服务端创建的Session对象也将会失效,但是,IIS在处理Session时,默认配置下,并不回立即将用户Session失效,通常需要等待1分钟左右时间,在这1分钟期间,用户的Session信息依然存储在服务端内存,如果被非法劫持利用的话很容易造成安全问题,所以在某些特定的场合,需要用户在页面窗口/标签关闭...
c++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源。具体来说: 了解string类 & 在我们研究string类犯了什么毛病之前,还让我先说一下如何了解一个C++的类。我们要了解一个C++的类,一般来说,要从三个方面入手。 & 一、&&&&&n...
C++语法基础
关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用 & const意味着&只读&,下面的声明都是什么意思?&& &代码如下&&&& const int *a;&& int ...
先说Foreach和For的区别,Foreach是针对对象进行遍历的,不需要定义循环次数,但是有个缺点,Foreach遍历取的是只读数据,不能在Foreach中进行对象的增删改,而For循环就可以。你这个改成while循环的代码如下: &代码如下 int i=0;while(i&ds.Table[&userreg&].Rows.Count){i++;} 例...
若您要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在5个工作日内回复。
售前咨询热线
支持与服务
资源和社区
关注阿里云
InternationalC# 如何让 多线程中每个线程间隔毫秒执行同一个方法?
[问题点数:200分]
C# 如何让 多线程中每个线程间隔毫秒执行同一个方法?
[问题点数:200分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
匿名用户不能发表回复!|C#多线程控制进度条之长异步操作 | 软件开发
C#多线程控制进度条之长异步操作
C#多线程控制进度条之长异步操作是如何实现的呢?让我们看看具体的过程:
我们上面程序中执行按钮的Click 处理如下:private&void&_btnRun_Click(&object&sender,&System.EventArgs&e&) &{ &RunTask(&Convert.ToInt32(&_txtSecond.Value&)&); &}&
C#多线程控制进度条之长异步操作遇到的问题:回想上面刚才问题发生的原因,直到 RunTask 执行完成后返回,Click 处理函数始终不能够返回,这就意味着用户界面不能处理重画事件或其他任何事件。一个解决方法就是创建另外一个线程,代码片断如下:&using&System.T &&private&int&_ &&//&执行任务工作线程进入点,C#多线程控制进度条之长异步操作 &void&RunTaskThreadStart() &{ &RunTask(&_seconds&); &} &&//&通过创建工作线程消除用户界面线程的阻塞问题 &private&void&_btnRun_Click(&object&sender,&System.EventArgs&e&) &{ &_seconds&=&Convert.ToInt32(&_txtSecond.Value&); &&Thread&runTaskThread&=&new&Thread(&new&ThreadStart(&RunTaskThreadStart&)&); &&runTaskThread.Start(); &}&//C#多线程控制进度条之长异步操作
现在,我们不再需要等待 RunTask 执行完成才能够从 Click 事件返回,我们创建了新的工作线程并让它开始工作、运行。

我要回帖

更多关于 java 异步线程 的文章

 

随机推荐