C#中的Invoke和BeginInvoke
一、Control#Invoke() 和Control#BeginInvoke()
在非UI线程中调用MessageBox.Show()结果是非模态对话框;
在UI线程中调用MessageBox.Show()结果是模态对话框。
也就是说,MessageBox的模态还是非模态控制的是它所在的那个线程!一旦使用MessageBox,它就阻塞了它所在的那个线程。
在非UI线程中调用System.Forms.Timer#Start方法不管用,在UI线程中才管用。
以上两个例子引出今日的主角:Control#Invoke()和Control#BeginInvoke()
- Invoke和BeginInvoke函数使得非UI线程可以方便地把任务放到UI线程中去执行
- 在UI线程中调用Invoke和BeginInvoke这两个函数是没有意义的,这两个函数只能在非UI线程中调用
因为它俩的作用就是非UI线程将任务交给UI线程去执行 - 这两个函数的区别是:Invoke会阻塞非UI线程;BeginInvoke不会阻塞非UI线程
在编程中,耗时的任务(比如IO,网络请求等)是不允许放在UI线程中的。这一点在一切界面编程中总是成立的。在桌面编程中,从没有库明确禁止耗时任务放在UI线程中。你可以把耗时的任务放在UI线程中,并没有错误,只是难受的是自己。而Android中明确规定UI线程中禁止网络请求,否则会抛出异常。
当耗时任务结束之后,通常需要更新界面,这时,Invoke和BeginInvoke这两个函数就派上大用了。
以上两个问题的解决方案:使用Invoke调用MessageBox.Show()和timer.Start().
this.Invoke(new Action(delegate{}));
二、委托的Invoke和BeginInvoke
string haha(string s) {
return s + s.Length;
}
delegate string h(string s);//定义一个函数指针类型
Haha() {
h ha = haha;
IAsyncResult res = ha.BeginInvoke("weidiao", null, null);
string ans = ha.EndInvoke(res);//此处会阻塞
Console.WriteLine(ans);
}
IAsyncResult.IsCompleted属性可以判断任务是否执行完毕。
IAsyncResult res = ha.BeginInvoke("weidiao", null, null);
while (res.IsCompleted == false) {
Console.Write("*");
Thread.Sleep(500);
}
string ans = ha.EndInvoke(res);
IAsyncResult.AsyncWaitHandle属性可以使当前线程(主调线程)等待一段时间。WaitOne的第一个参数表示要等待的毫秒数,在指定时间之内,WaitOne方法将一直等待,直到异步调用完成,并发出通知,WaitOne方法才返回true。当等待指定时间之后,异步调用仍未完成,WaitOne方法返回false,如果指定时间为0,表示不等待,如果为-1,表示永远等待,直到异步调用完成。
h ha = haha;
IAsyncResult res = ha.BeginInvoke("weidiao", null, null);
while (!res.AsyncWaitHandle.WaitOne(500)) {
Console.Write("*");
}
string ans = ha.EndInvoke(res);
Console.WriteLine(ans);
使用回调函数
using System;
using System.Threading;
using System.Windows.Forms;
class Haha {
string haha(string s) {
Thread.Sleep(3000);
return s + s.Length;
}
delegate string h(string s);
void callback(IAsyncResult res) {
Console.Write(ha.EndInvoke(res));
}
h ha ;
Haha() {
ha = haha;
IAsyncResult res = ha.BeginInvoke("haha", new AsyncCallback(callback), null);
}
static void Main() {
new Haha();
Application.Run(new Form());
}
}
C#中的Invoke和BeginInvoke的更多相关文章
- .Net基础——程序集与CIL HttpClient封装方法 .Net Core 编码规范 C#中invoke和beginInvoke的使用 WebServeice 动态代理类
.Net基础——程序集与CIL 1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll ...
- invoke和beginInvoke
首先说下,invoke和begininvoke的使用有两种情况: 1. control中的invoke.begininvoke. 2. delegrate中的invoke.begininvoke. 这 ...
- Control的Invoke和BeginInvoke详解
(一)Control的Invoke和BeginInvoke 我们要基于以下认识: (1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不 ...
- C#异步编程のWPF Invoke和BeginInvoke
我们先看个简单的例子: private void Window_Loaded(object sender, RoutedEventArgs e) { Console.WriteLine("B ...
- 2019.03.26 读书笔记 关于 invoke与begininvoke
invoke与begininvoke是同步委托和异步委托,但是有两种使用情况: 1. control中的invoke.begininvoke. 2. delegrate中的invoke.beginin ...
- Invoke 与 BeginInvoke的区别
引用文章路径:https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke ...
- invoke和begininvoke 区别
一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解. 首先说下,invoke和begininvoke的使用有两种情况: 1. c ...
- C#中Invoke 和 BeginInvoke 的区别
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句 ...
- Dispatcher中Invoke与BeginInvoke
[同步]Invoke Application.Current.Dispatcher.Invoke(AutoIncreaseNumber); [异步]BeginInvoke Application.Cu ...
随机推荐
- Error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory
32位系统:ln -s /opt/base/3.3/lib/libpq.so.5 /usr/lib/libpq.so.5 64位系统:ln -s /opt/base/3.3/lib/libpq.so. ...
- Asp.net FileUpload+Image制作头像效果
在Web开发中会经常使用到个人信息注册,而个人信息中通常需要自己的头像或者照片.今天主要介绍一下使用FileUpload+img控件上传照片. FileUpLoad控件使用介绍 FileUpLoad控 ...
- 近看到的机器学习、NLP相关书单
书单再多,不去读,也是白搭~~ 水木上的machine learning书单:http://www.newsmth.net/bbscon.php?bid=5&id=34859&ftyp ...
- Asp.Net Core App 部署故障示例 2
相关阅读:Windows + IIS 环境部署Asp.Net Core App 1. HTTP Error 502.5 – Process Failure 环境 Windows Server 201 ...
- java中需要用equals来判断两个字符串值是否相等
在C++中,两个字符串比较的代码可以为: (string1==string2) 但在java中,这个代码即使在两个字符串完全相同的情况下也会返回false Java中必须使用string1.equal ...
- unity 静态合批
想做这样一个优化 因为cmd drawcall太多 materials太多导致 实际上只是贴图不一样 想用texture2DArray把他们合起来 texArray这步功能倒是很快就好了 但是从fra ...
- 微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务
WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...
- 使用svgdeveloper 和 svg-edit 绘制svg地图
目录: 1. 描述 2. 准备工作 3. 去除地图模板上的水印(可跳过) 4. 方法一.SVGDeveloper 5. 方法二.SVG-Edit 1. 描述编辑 有的时候我们需要自定义地图,本文提 ...
- iphone手机微信端html5 Geolocation定位失效的问题
使用Geolocation方法存在错误信息error.POSITION_UNAVAILABLE 其实问题不局限于微信端而是iphone升级到ios10后,对获取地理位置信息作出了限制,只有https的 ...
- Android -- 保存文件
背景 我们以常见 ...