C#中Invoke和BeginInvoke的区别
1、Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
2、BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容,表现出“异步”的概念。在想获取 BeginInvoke() 执行完毕后的结果时,调用EndInvoke() 方法来获取。而这两个方法中执行的是一个委托。
测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace InvokeDemo
{
class Program
{
//代理
private delegate int Mydelegate(int a, int b); static void Main(string[] args)
{
Console.WriteLine("Invoke开始,时间:" + DateTime.Now);
Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
Mydelegate myd = new Mydelegate(Fun);
var result = myd.Invoke(, );
Console.WriteLine("计算结果:" + result);
Console.WriteLine("Invoke结束,时间:" + DateTime.Now); Console.WriteLine();
Console.WriteLine("------分割线------");
Console.WriteLine(); Console.WriteLine("BeginInvoke开始,时间:" + DateTime.Now);
Mydelegate mydSync = new Mydelegate(Fun);
mydSync.BeginInvoke(, , new AsyncCallback(AsyncCallback), mydSync);
Console.WriteLine("BeginInvoke结束,时间:" + DateTime.Now); Console.Read();
} static int Fun(int a, int b)
{
Thread.Sleep();
Console.WriteLine("方法线程ID:" + Thread.CurrentThread.ManagedThreadId);
return a + b;
} static void AsyncCallback(IAsyncResult asyncResult)
{
var del = (Mydelegate)asyncResult.AsyncState;
var funResult = del.EndInvoke(asyncResult);
Console.WriteLine("计算结果:" + funResult);
}
}
}
结果:
可以看出:
Invoke方法中线程ID跟主线程ID一致,表现是阻塞的。
InvokeBegin方法中线程ID跟主线程ID不一致,表现是异步的。
C#中Invoke和BeginInvoke的区别的更多相关文章
- C#中Invoke 和 BeginInvoke 的区别
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句 ...
- .Net基础——程序集与CIL HttpClient封装方法 .Net Core 编码规范 C#中invoke和beginInvoke的使用 WebServeice 动态代理类
.Net基础——程序集与CIL 1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll ...
- Invoke 和 BeginInvoke 的区别(转发)
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...
- Invoke 与 BeginInvoke的区别
引用文章路径:https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke ...
- Dispatcher中Invoke与BeginInvoke
[同步]Invoke Application.Current.Dispatcher.Invoke(AutoIncreaseNumber); [异步]BeginInvoke Application.Cu ...
- Invoke 和 BeginInvoke 的区别
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dot ...
- Invoke和BeginInvoke的区别(转载)
转自http://www.cnblogs.com/c2303191/articles/826571.html Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线 ...
- WPF Invoke与BeginInvoke的区别
Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句 ...
- Unity中Invoke 和 InvokeRepeating的区别
Invoke() 方法是 Unity3D 的一种委托机制 如: Invoke("Test", 5); 它的意思是:5 秒之后调用 Test() 方法: 使用 Invoke() ...
随机推荐
- POJ 3176 Cow Bowling (水题DP)
题意:给定一个金字塔,第 i 行有 i 个数,从最上面走下来,只能相邻的层数,问你最大的和. 析:真是水题,学过DP的都会,就不说了. 代码如下: #include <cstdio> #i ...
- 编译安装-Nginx
安装Nginx 1.环境准备 2.创建nginx用户 3.安装pcre-8.33.tar.gz 4.安装nginx-1.5.4.tar.gz 6.开机自启动 安装Nginx 1.环境准备 系统:Cen ...
- Chrome的JS调试工具
你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用 ...
- 跨浏览器实现盒阴影(box-shadow)效果
现在流行的设计里总是使用了大量的阴影,看看Vista.win7里夸张的box阴影,mac里的阴影比比皆是.CSS3的box-shadow属性可以让我们轻松实现图层阴影效果,使我们可以不再总是依赖于使用 ...
- cmd下运行PowerShell命令
PowerShell -Command "& {Get-EventLog -LogName security}"
- Swift学习笔记十五
自动引用计数(Automatic Reference Counting) 和OC一样,Swift用自动引用计数机制来跟踪和管理你应用程序的内存,大多数情况下,你不需要考虑自己管理内存,Swift会自动 ...
- Google Map和桌面组件 Android开发教程
本文节选于机械工业出版社推出的<Android应用开发揭秘>一 书,作者为杨丰盛.本书内容全面,详细讲解了Android框架.Android组件.用户界面开发.游戏开发.数据存储.多媒体开 ...
- jquery控制css的display(控制元素的显示与隐藏)
使用jquery控制div的显示与隐藏: $("#div的id").show()表示display:block, $("#div的id").hide()表示di ...
- 20 Free Open Source Web Media Player Apps
free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...
- Cassandra目录
1. cassandra安装 2. 过滤文本文档中的数据并插入Cassandra数据库 3. 用Java实现向Cassandra数据库中插入和查询数据 4. Cassandra在CQL语言层面支持多种 ...