zoukankan      html  css  js  c++  java
  • 异步委托

    简介

    委托(Delegate):就是类似于C/C++中的函数指针,由于C#中没有指针,使该语言存在着对某种方法的引用,该引用在运行时改变。被说成是:“委托可以把方法当作参数在另一个方法中传递和调用”,“委托是方法的快捷方式”等等,我的简单理解就是创建两个相同的函数,想用使用A函数,可以借助委托函数B进行调用。关键字为delegate。
    想要深入理解委托,可以学习一下这篇文章深入理解委托

    在winForm开发过程中经常用到线程,又是会遇到在多线程中访问线程外的空间。,比如:设置textbox的Text属性等等。如果直接设置程序必 定会报出:从不是创建控件的线程访问它,这个异常。
    通常我们可以采用两种方法来解决。
    一是通过设置control的属性。
    二是通过delegate,而通 过delegate也有两种方式,一种是常用的方式,另一种就是匿名方式。

    委托

    .NET中对invoke和begininvoke的官方定义:
    control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。
    control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。
    从而得知:invoke表是同步、begininvoke表示异步

    下面举例一个委托使用的例子:

    delegate void SafeSetText(string strMsg);
    private void SetText(string strMsg)
    {
     if(textbox1.InvokeRequired)  //判断是否已经申请回调
     {
        SafeSetText objSet=new SafeSetText(SetText); //实例回调对象,后面进行执行
        textbox1.Invoke(objSet,new object[]{strMsg});   //执行回调
     }
     else
     {
       textbox1.Text=strMsg;            //控件显示
     }
    }
    

    异步委托

    .NET Framework 允许您异步调用任何方法。 为此,应定义与您要调用的方法具有相同签名的委托;公共语言运行时会自动使用适当的签名为该委托定义 BeginInvoke 和 EndInvoke 方法。

    下面是一个异步委托的例子:

    static void Main()
    {
    //synchronous method call
    //TakesAWhile(1 , 3000);
    
    //asynchronous by using a delegate
    TakesAWhileDelegate d1 = TakesAWhile;
    IAsyncResult ar = d1.BeginInvoke(1, 3000, null ,null); //执行异步委托
    while(!ar.IsCompleted)
    {
    	//doing something else in the main thread
    	Console.Write(".");
    	Thread.Sleep(50);
    }
    int result = d1.EndInvoke(ar);  //获取异步委托的结果
    Console.WriteLine("Result:{0}",result);
    }
    

    TakesAWhile为需要委托函数,
    TakesAWhileDelegate 为委托函数,
    BeginInvoke 方法启动异步调用。
    BeginInvoke方法返回一个 IAsyncResult,用来监视异步调用的进度,
    EndInvoke 方法检索异步调用的结果。

    IAsyncResult 类型公开以下成员:
    AsyncState :获取用户定义的对象,它限定或包含关于异步操作的信息
    AsyncWaitHandle :获取用于等待异步操作完成的 WaitHandle
    CompletedSynchronously :获取一个值,该值指示异步操作是否同步完成
    IsCompleted :获取一个值,该值指示异步操作是否已完成

    总结

    该文章对委托和异步委托做了一个介绍与区别说明,不是很深入,后期再补。

  • 相关阅读:
    浅谈 iOS 事件的传递和响应过程
    iOS 之渐变颜色
    系统enum的一些样式
    Storyboard操作的2个小技巧
    iOS 动画初步
    iOS之Runtime初应用
    Block使有注意点
    使用ios系统自带分享
    IOS原生地图与高德地图
    反向传值实例
  • 原文地址:https://www.cnblogs.com/qq-375291943/p/10062124.html
Copyright © 2011-2022 走看看