• 复习及总结--.Net线程篇(1)


    老是没耐心写这些东西,最近想想也工作两年了,该对自己的东西做个整理了,不知道这次能坚持写几篇,总得来说尽量督促自己吧

    言归正传,.net中的多线程主要可以使用两种方法进行调用

    1,异步调用

    2,Thread类的调用

    今天主要讨论的是异步调用

       异步调用:使用委托来调用主要通过BeginInvoke方法和EndInvoke方法进行调用,所有.Net中牵扯到异步调用的地方都是使用了多线程的概念

       

    public IAsyncResult BeginInvoke (
        InvokeArgs invokeArgs,
        AsyncCallback callback,
        Object userState
    )
                  该方法主要负责进行异步的调用
    参数
    invokeArgs
    调用操作的参数。
    callback
    在完成调用后要调用的回调。
    userState
    与此操作相关联的可选用户状态。
    
    返回值
     用来标识此调用的异步结果。
    
    
    public InvokeCompletedResult EndInvoke (
        IAsyncResult asyncResult
    )
                  该方法主要用于主线程等待异步线程结束
    参数
    asyncResult
    用于标识调用的异步结果。
    返回值
    操作的结果。
       private void button1_Click(object sender, EventArgs e)
            {
    
                Person person = new Person();
    
                DelGetSum getmax = new DelGetSum(sum);
    
                IAsyncResult result = getmax.BeginInvoke(1, 2, Callback, person);
                
                int a= getmax.EndInvoke(result);
    
                MessageBox.Show("");
    
    
            }
            private void Callback(IAsyncResult ar)
            {
                Person p= (Person)ar.AsyncState;
    
                while (true)
                {
                    p.Name = "Eric";
                    p.Age = 18;
                }
            }
    
            delegate int DelGetSum(int a, int b);
    
            private int sum(int a,int b)
            {
                return a + b;
            }
    
        public class Person
        {
            public string Name
            {
                set;
                get;
            }
            public int Age
            {
                get;
                set;
            }
        }
    
    
        

    以上代码将不会调用MessageBox(""),由于EndInvoke方法一直处于死循环,所以EndInvoke的功能也就是用来等待异步调用结束后,然后继续主线程上的任务

    讲到委托了那就把这里的方法都列出来吧,这样省的以后再去找了(与多线程无关,可跳过)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Thread
    {
        public partial class DelegateDemo2 : Form
        {
            public DelegateDemo2()
            {
                InitializeComponent();
            }
    
            private void DelegateDemo2_Load(object sender, EventArgs e)
            {
                DelGetSum getsum = new DelGetSum(sum1);
    
                getsum += sum2;
    
                getsum.GetInvocationList(); //获取多路委托所指向的所有方法
    
                getsum.Invoke(1, 3);    //进行同步的调用
    
                getsum.DynamicInvoke(new object[]{
                1,2
                });                      //动态绑定方法参数,返回值为Object--代表方法的返回值,这里也就是3
    
    
    
            }
            delegate int DelGetSum(int a, int b);
             
            private int sum1(int a, int b)
            {
                return a + b;
            }
    
            private int sum2(int a, int b)
            {
                return a + b;
            }
        }
    }
    delegate其他方法

    接下来讲解下    IAsyncResult

        IAsyncResult 根据名字很容易想到他的作用,也就是异步调用的结果

         下面是另外两种等待异步线程结束的方法,供参考

         同事如果要对异步线程传入自定义对象时,可以通过BeginInvoke的第3个参数传入

         通过回调函数的参数  IAsyncResult.AsyncState属性进行操作其结果

    private void DelDemo3_Load(object sender, EventArgs e)
            {
                  DelegateDemo2 del2=new DelegateDemo2();
                
                DelGetSum sum = new DelGetSum(del2.sum1);
                Person p=new Person();
                p.Name = "Eric";
                p.Age = 18;
               IAsyncResult result= sum.BeginInvoke(1, 2, Callback, p);
    
               while (!result.IsCompleted) //也是用于等待异步方法结束的语句---类似EndInvoke方法
               {
                   ;
               }
    
               result.AsyncWaitHandle.WaitOne(); //也是用于等待异步方法结束的语句---类似EndInvoke方法
    
    
            }
            private void Callback(IAsyncResult ar)
            {
                Person p = (Person)ar.AsyncState; //通过这个属性来获取传入的p参数
    
    
                p.Name = "Andy";
                p.Age = 21;
    
                for (int i = 1; i < 1000; )
                {
                    i++;
                }
            }
  • 相关阅读:
    2020.7.11
    2020.7.13
    2020.7.9
    2020.7.10
    Java入门——day13
    Java入门——day12
    Java入门——day11
    虚拟交换机
    KVM虚拟化 ProxmoxVE
    【路径】python环境错误调试【执行路径】【操作系统,版本】
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/3453012.html
Copyright © 2020-2023  润新知