C# Invoke 使用 异步委托
如果使用多线程,应该会遇到这样的一个问题,在子线程中想调用主线程中(Form1)控件,提示报错!
可以使用Invoke方法调用。
- this.Invoke(new MethodInvoker(() =>
- {
- this.rTxtLog.AppendText("在线程内调用主线程中控件 " + Environment.NewLine);
- }));
异步委托学习,
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Remoting.Messaging;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace 线程与异步委托练习
- {
- class Program
- {
- //声明一个委托,
- public delegate int AddFunDel(int a, int b);
- static void Main(string[] args)
- {
- Console.WriteLine("主线程{0},已启动...", Thread.CurrentThread.ManagedThreadId);
- #region 线程
- ////ParameterizedThreadStart 有参委托
- ////ThreadStart 无参委托
- //Thread thread = new Thread(new ThreadStart(MyFun));
- ////设置线程名称 给程序员看的。
- //thread.Name = "MyFun";
- ////设置为后台线程。当主线程被关闭时,后台子线程自动被关闭。
- //thread.IsBackground = true;
- ////更改状态,并没有执行,只是告诉CPU,可以执行了。
- //thread.Start();
- #endregion
- #region 有参线程
- ////Thread thread2 = new Thread(new ParameterizedThreadStart(MyFun2));
- //Thread thread2 = new Thread(a => {
- // while (true)
- // {
- // Console.WriteLine("子线程{0},正在执行中。参数值:{1}", Thread.CurrentThread.ManagedThreadId, a);
- // Thread.Sleep(1000);
- // }
- //});
- //thread2.Name = "MyFun2";
- //thread2.IsBackground = true;
- ////设置优先级,只是建议告诉CPU处理。
- //thread2.Priority = ThreadPriority.Highest;
- //thread2.Start(99);
- #endregion
- #region 异步委托
- //AddFunDel aDel = new AddFunDel(AddFun);
- ////通过异步调用这个委托
- //IAsyncResult iresult = aDel.BeginInvoke(3, 5, null, null);
- ////...异步委托,在新建子线程中执行委托中方法,主线程被阻塞状态。
- //int num = aDel.EndInvoke(iresult);
- //Console.WriteLine("计算结果:{0} , 执行线程{1}", num, Thread.CurrentThread.ManagedThreadId);
- #endregion
- #region 异步委托回调函数
- AddFunDel aDel = new AddFunDel(AddFun);
- //AsyncCallback
- IAsyncResult iresult = aDel.BeginInvoke(, , new AsyncCallback(MyAsyncCallback), );
- //主线程不会阻塞
- while (!iresult.IsCompleted) //IsCompleted 检测异步操作是否已完成。
- {
- Console.WriteLine("主线程继续执行中...");
- Thread.Sleep();
- }
- #endregion
- Console.ReadKey();
- }
- static void MyFun()
- {
- while (true)
- {
- Console.WriteLine("子线程{0},正在执行中。", Thread.CurrentThread.ManagedThreadId);
- Thread.Sleep();
- }
- }
- static void MyFun2(object a)
- {
- Console.WriteLine("子线程{0},正在执行中。参数值:{1}", Thread.CurrentThread.ManagedThreadId, a);
- }
- static int AddFun(int a, int b)
- {
- Console.WriteLine("子线程{0},正在执行中,开始运算a+b", Thread.CurrentThread.ManagedThreadId);
- Thread.Sleep();
- return a + b;
- }
- //异步委托回调函数
- static void MyAsyncCallback(IAsyncResult result)
- {
- AsyncResult aResult = (AsyncResult)result; //封装类 通过接口 实现多态
- AddFunDel addDel = (AddFunDel)aResult.AsyncDelegate; //封装委托
- int num = addDel.EndInvoke(result); //获取异步操作结果
- Console.WriteLine("计算结果:{0} , 执行线程{1}", num, Thread.CurrentThread.ManagedThreadId);
- int i = (int)aResult.AsyncState; //BeginInvoke方法中最后一个参数
- Console.WriteLine("BeginInvoke最后一个参数调用:{0}", i);
- }
- }
- }
C# Invoke 使用 异步委托的更多相关文章
- c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调
单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...
- C#固定时间执行指定事件(观察者模式+异步委托)
最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...
- 异步委托 多线程实现摇奖器 winform版
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理
描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...
- .net异步委托
委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大佬使用If-Else(Switch)语句,同时使得程序 ...
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件
通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二). 前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...
- .NET委托解析(异步委托)
上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源 ...
- Async异步委托
/// <summary> /// 异步委托 /// </summary> public delegate void AsyncHandler(); public static ...
- 异步委托(APM)使用Func异步操作,处理耗时操作
使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: using System; using System.Collections.Generic; using System.Linq; ...
随机推荐
- 获取UUID
UDID 设备的唯一标识符,也就是设备的序列号,在iOS2.0版本中UIDevice提供了一个获取设备唯一标识符的方法uniqueldentifier,这个方法也是为一个可以确认获取此标识符的方法.但 ...
- 我的第五个java程序 每过10秒读取一次天气 并把天气更新到mysql数据库里
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; ...
- iOS-tableview【终极方案】精准获取webView内容高度,自适应高度
关于WebView内容高度的获取,相信很多人都踩过坑,无法获取到准确高度,导致页面布局出现差错,搜到的资料很多但都无法解决问题,以下是个人经验总结: 项目需求实现H5文章&原生评论效果,文章是 ...
- ios -将navigationbar的translucent属性设为No后,子控制器视图整体下移问题
如果不将navigationbar.translucent = YES 会觉得颜色很浅,因为这是半透明状态 若navigationbar.translucent = NO,颜色问题解决,但是子控制器视 ...
- OpenCV学习笔记九:opencv_stitching模块
一,简介: 该库用于图像拼接.
- yii 国际化
http://www.yiichina.com/doc/guide/2.0/tutorial-i18n config/main.php 外层加 'language' => 'en-US', 's ...
- Linq中GroupBy方法的使用总结(转载)
from:https://www.cnblogs.com/zhouzangood/articles/4565466.html Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均 ...
- .net framework 4.5 在Visual studio 2015中丢失
解决办法:从另一台C:\Program Files(x86)\Reference Assemblies\Microsoft\.NetFramework 成功的环境中copy .net4.5 文件夹到错 ...
- EasyNVR智能云终端硬件使用场景分析:如何实现软硬一体的视频上云整体解决方案
背景分析 在于众多的客户交流中,经常会被客户问到,"EasyNVR到底是软件还是硬件?"."EasyNVR能否出一个硬件的版本,摆脱自建服务器的压力?".&qu ...
- Nginx服务监听端口修改启动bug
监听的端口从80 修改到其他端口出现启动不起来问题. 解决方案如下: yum install policycoreutils-python sudo cat /var/log/audit/audit. ...