如果使用多线程,应该会遇到这样的一个问题,在子线程中想调用主线程中(Form1)控件,提示报错!

可以使用Invoke方法调用。

  1. this.Invoke(new MethodInvoker(() =>
  2. {
  3. this.rTxtLog.AppendText("在线程内调用主线程中控件 " + Environment.NewLine);
  4. }));

异步委托学习,

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.Remoting.Messaging;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8.  
  9. namespace 线程与异步委托练习
  10. {
  11. class Program
  12. {
  13. //声明一个委托,
  14. public delegate int AddFunDel(int a, int b);
  15. static void Main(string[] args)
  16. {
  17. Console.WriteLine("主线程{0},已启动...", Thread.CurrentThread.ManagedThreadId);
  18. #region 线程
  19. ////ParameterizedThreadStart 有参委托
  20. ////ThreadStart 无参委托
  21. //Thread thread = new Thread(new ThreadStart(MyFun));
  22. ////设置线程名称 给程序员看的。
  23. //thread.Name = "MyFun";
  24. ////设置为后台线程。当主线程被关闭时,后台子线程自动被关闭。
  25. //thread.IsBackground = true;
  26. ////更改状态,并没有执行,只是告诉CPU,可以执行了。
  27. //thread.Start();
  28. #endregion
  29.  
  30. #region 有参线程
  31. ////Thread thread2 = new Thread(new ParameterizedThreadStart(MyFun2));
  32. //Thread thread2 = new Thread(a => {
  33. // while (true)
  34. // {
  35. // Console.WriteLine("子线程{0},正在执行中。参数值:{1}", Thread.CurrentThread.ManagedThreadId, a);
  36. // Thread.Sleep(1000);
  37. // }
  38. //});
  39. //thread2.Name = "MyFun2";
  40. //thread2.IsBackground = true;
  41. ////设置优先级,只是建议告诉CPU处理。
  42. //thread2.Priority = ThreadPriority.Highest;
  43. //thread2.Start(99);
  44. #endregion
  45.  
  46. #region 异步委托
  47. //AddFunDel aDel = new AddFunDel(AddFun);
  48. ////通过异步调用这个委托
  49. //IAsyncResult iresult = aDel.BeginInvoke(3, 5, null, null);
  50. ////...异步委托,在新建子线程中执行委托中方法,主线程被阻塞状态。
  51. //int num = aDel.EndInvoke(iresult);
  52. //Console.WriteLine("计算结果:{0} , 执行线程{1}", num, Thread.CurrentThread.ManagedThreadId);
  53. #endregion
  54.  
  55. #region 异步委托回调函数
  56. AddFunDel aDel = new AddFunDel(AddFun);
  57. //AsyncCallback
  58. IAsyncResult iresult = aDel.BeginInvoke(, , new AsyncCallback(MyAsyncCallback), );
  59. //主线程不会阻塞
  60. while (!iresult.IsCompleted) //IsCompleted 检测异步操作是否已完成。
  61. {
  62. Console.WriteLine("主线程继续执行中...");
  63. Thread.Sleep();
  64. }
  65. #endregion
  66. Console.ReadKey();
  67. }
  68.  
  69. static void MyFun()
  70. {
  71. while (true)
  72. {
  73. Console.WriteLine("子线程{0},正在执行中。", Thread.CurrentThread.ManagedThreadId);
  74. Thread.Sleep();
  75. }
  76. }
  77.  
  78. static void MyFun2(object a)
  79. {
  80. Console.WriteLine("子线程{0},正在执行中。参数值:{1}", Thread.CurrentThread.ManagedThreadId, a);
  81. }
  82.  
  83. static int AddFun(int a, int b)
  84. {
  85. Console.WriteLine("子线程{0},正在执行中,开始运算a+b", Thread.CurrentThread.ManagedThreadId);
  86. Thread.Sleep();
  87. return a + b;
  88. }
  89.  
  90. //异步委托回调函数
  91. static void MyAsyncCallback(IAsyncResult result)
  92. {
  93. AsyncResult aResult = (AsyncResult)result; //封装类 通过接口 实现多态
  94. AddFunDel addDel = (AddFunDel)aResult.AsyncDelegate; //封装委托
  95. int num = addDel.EndInvoke(result); //获取异步操作结果
  96. Console.WriteLine("计算结果:{0} , 执行线程{1}", num, Thread.CurrentThread.ManagedThreadId);
  97. int i = (int)aResult.AsyncState; //BeginInvoke方法中最后一个参数
  98. Console.WriteLine("BeginInvoke最后一个参数调用:{0}", i);
  99. }
  100. }
  101. }

C# Invoke 使用 异步委托的更多相关文章

  1. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调

    单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...

  2. C#固定时间执行指定事件(观察者模式+异步委托)

    最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...

  3. 异步委托 多线程实现摇奖器 winform版

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  4. 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理

    描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...

  5. .net异步委托

    委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大佬使用If-Else(Switch)语句,同时使得程序 ...

  6. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  7. .NET委托解析(异步委托)

    上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源 ...

  8. Async异步委托

    /// <summary> /// 异步委托 /// </summary> public delegate void AsyncHandler(); public static ...

  9. 异步委托(APM)使用Func异步操作,处理耗时操作

    使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: using System; using System.Collections.Generic; using System.Linq; ...

随机推荐

  1. 获取UUID

    UDID 设备的唯一标识符,也就是设备的序列号,在iOS2.0版本中UIDevice提供了一个获取设备唯一标识符的方法uniqueldentifier,这个方法也是为一个可以确认获取此标识符的方法.但 ...

  2. 我的第五个java程序 每过10秒读取一次天气 并把天气更新到mysql数据库里

    import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; ...

  3. iOS-tableview【终极方案】精准获取webView内容高度,自适应高度

    关于WebView内容高度的获取,相信很多人都踩过坑,无法获取到准确高度,导致页面布局出现差错,搜到的资料很多但都无法解决问题,以下是个人经验总结: 项目需求实现H5文章&原生评论效果,文章是 ...

  4. ios -将navigationbar的translucent属性设为No后,子控制器视图整体下移问题

    如果不将navigationbar.translucent = YES 会觉得颜色很浅,因为这是半透明状态 若navigationbar.translucent = NO,颜色问题解决,但是子控制器视 ...

  5. OpenCV学习笔记九:opencv_stitching模块

    一,简介: 该库用于图像拼接.

  6. yii 国际化

    http://www.yiichina.com/doc/guide/2.0/tutorial-i18n config/main.php 外层加 'language' => 'en-US', 's ...

  7. Linq中GroupBy方法的使用总结(转载)

    from:https://www.cnblogs.com/zhouzangood/articles/4565466.html Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均 ...

  8. .net framework 4.5 在Visual studio 2015中丢失

    解决办法:从另一台C:\Program Files(x86)\Reference Assemblies\Microsoft\.NetFramework 成功的环境中copy .net4.5 文件夹到错 ...

  9. EasyNVR智能云终端硬件使用场景分析:如何实现软硬一体的视频上云整体解决方案

    背景分析 在于众多的客户交流中,经常会被客户问到,"EasyNVR到底是软件还是硬件?"."EasyNVR能否出一个硬件的版本,摆脱自建服务器的压力?".&qu ...

  10. Nginx服务监听端口修改启动bug

    监听的端口从80 修改到其他端口出现启动不起来问题. 解决方案如下: yum install policycoreutils-python sudo cat /var/log/audit/audit. ...