博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Invoke 使用 异步委托
阅读量:5173 次
发布时间:2019-06-13

本文共 3616 字,大约阅读时间需要 12 分钟。

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

你可能感兴趣的文章
数据仓库 - 3.数据仓库基本概念
查看>>
自定义树莓派的显示分辨率
查看>>
sql full left right inner cross 基础
查看>>
SpringBoot + Mybaties的逆向工程有数据库生成domain的过程
查看>>
Android控件TextView之跑马灯功能问题记录
查看>>
国外漂亮质感网页设计作品欣赏 转
查看>>
SVN学习总结
查看>>
cognos安装 win7+Sqlserver08SP1
查看>>
Java的21个技术点和知识点归纳
查看>>
安卓中Paint类和Canvas类的方法汇总
查看>>
提供openssl -aes-256-cbc兼容加密/解密的简单python函数
查看>>
数据结构-表
查看>>
【转载】下一代Web应用模型:Progressive Web App
查看>>
gridControl 部分属性
查看>>
Csharp: read Sybase SQL anywhere5.5 using c#
查看>>
一行代码,浏览器变临时编辑器
查看>>
This application is modifying the autolayout engine from a background threa-线程错误
查看>>
Python的索引迭代
查看>>
thinkphp3.2中模板遍历数据之标签<if condition=" ">中的数据只能用数组形式
查看>>
可设置最小时间和最大时间的24小时时间选择器
查看>>