如果使用多线程,应该会遇到这样的一个问题,在子线程中想调用主线程中(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);//AsyncCallbackIAsyncResult iresult = aDel.BeginInvoke(3, 5, new AsyncCallback(MyAsyncCallback), 30);//主线程不会阻塞while (!iresult.IsCompleted) //IsCompleted 检测异步操作是否已完成。
            {Console.WriteLine("主线程继续执行中...");Thread.Sleep(1000);}#endregionConsole.ReadKey();}static void MyFun(){while (true){Console.WriteLine("子线程{0},正在执行中。", Thread.CurrentThread.ManagedThreadId);Thread.Sleep(1000);}}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(5000);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);}}
}

转载于:https://www.cnblogs.com/han1982/p/4072638.html

C# Invoke 使用 异步委托相关推荐

  1. [转载]C#异步委托的用法 .

    每个委托都有三个方法:Invoke.BeginInvoke.EndInvoke.第一个方法是委托指定函数的同步调用,另外两个是异步调用. BeginInvoke方法,调用后立即返回,不等待调用结果.E ...

  2. 多线程,异步委托,同步委托几种方式的区别

    Code         public delegate void DoThingsDelegate();         private void Window_Loaded(object send ...

  3. 异步委托实现多线程winform控件编程

            private void button1_Click(object sender, EventArgs e)         {             ThreadStart ts  ...

  4. .NET简谈组件程序设计之(异步委托)

    说到委托我想大家基本上都用过的,今天这篇文章就来讲解关于委托的异步奥秘. 在我们正常使用的时候很少会去用异步委托技术来提高代码效率.委托的好处就是能对方法进行面向对象的封装,随意传递.在任何组件客户代 ...

  5. C# 异步委托 BeginInvoke EndInvoke

    1. 简单主线程中委托: static void Main(string[] args) {//定义一个委托,并初始化Func<int, int, string> delFunc = (a ...

  6. 界面-工作者线程结构之:异步委托调用

    1.流程: 1.1 定义一个委托,形如:public delegate object WorkThread(object controlsAndParameters);由于object可以容纳任何.N ...

  7. C#异步编程的实现方式(1)——异步委托

    异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它. .Net Framework已经为我们提供了委托的异步调用方法.下面介绍三种使用委托实现异步的方法. 1.投票(IsComplet ...

  8. [转]C#异步编程的实现方式(1)——异步委托

    异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它. .Net Framework已经为我们提供了委托的异步调用方法.下面介绍三种使用委托实现异步的方法. 1.投票(IsComplet ...

  9. C#线程通信与异步委托

    线程的通知机制 AutoResetEvent是线程实现通知操作的重要方法.通常,AutoResetEvent用于通知正在等待线程已发生事件,允许线程通过发信号互相通信. AutoResetEvent时 ...

  10. [转]C#综合揭秘——细说多线程(上)

    C#综合揭秘--细说多线程(上) 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及 ...

最新文章

  1. chrome登录_比Chrome还要好用?(全新edge浏览器体验)
  2. IBM powerVM VIOS
  3. include *.h 和 declare class *; 的区别?
  4. 数据结构与算法之堆排序
  5. (找规律)Magic of David Copperfield
  6. javascript学习笔记_function
  7. 安卓案例:标准化测试
  8. C语言的那些秘密之---函数返回局部变量(转)
  9. [Linux学习笔记] Linux常用命令 - 文件搜索命令
  10. WIN7下访问ftp的方法
  11. 学python心得体会800字-Python初学心得体会
  12. PLSQL连接本地的Oracle数据库
  13. POJ 3264 -----RMQ问题
  14. 图像特征提取(二)——SIFT算法详解
  15. Windows系统 clac命令详解,Windows系统使用命令行打开计算器
  16. 使用Visual Studio编译Qt项目出现“E1696 无法打开Qt源文件”的解决方案,亲测可行
  17. 【设计模式】观察者模式
  18. opencv c++实现棋盘格标定
  19. 安装 android 模拟器
  20. 数学建模:线性规划及 Python 求解

热门文章

  1. JS 数组 Array 对象详解 与 for...of 增强型迭代
  2. getWriter() has already been called for this response
  3. Navicat Premium 15 逆向表到模型
  4. 关于/r与/n以及 /r/n 的区别总结
  5. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_6 Mybatis的CRUD-保存操作的细节-获取保存数据的id...
  6. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_11_练习:集合元素处理(Stream方式)...
  7. git 小札 - 流程总览
  8. MAVEN项目标准目录结构(转)
  9. tomcat开启远程调试
  10. JS调用asp.net后台方法:PageMethods