zoukankan      html  css  js  c++  java
  • 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(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);
            }
        }
    }
  • 相关阅读:
    软件测试第五次作业
    第四次博客作业(第一题)
    实验二
    安全开发
    代码审计入门
    破壳笔记-渗透测试
    Libra的思考
    深度学习构建视频人脸识别模型
    tensorflow
    数据结构(长期)
  • 原文地址:https://www.cnblogs.com/han1982/p/4072638.html
Copyright © 2011-2022 走看看