Heim  >  Artikel  >  类库下载  >  C#的异步回调函数

C#的异步回调函数

高洛峰
高洛峰Original
2016-10-13 16:15:562801Durchsuche

关于C#的异步回调,在ActionScript 3.0当中 , 有关键字Function , 可以直接传class函数为回调函数。但是在C#当中,需要使用到委托,其中应用的最多的当属 : Action / Func 。当然你可以使用关键字delegate来自定义委托。这里翼Action /  Func为例来讲解C#的异步回调,如果不了解C#的委托机制,需要自己先百度/Google一下,再来看这篇博客。



BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有后面的两个额外的参数:第一个 : 异步调用执行完毕后的回调函数 , 此函数有一个参数 : IAsyncResult 。第二个为状态Object,可以传任意的值 , 用IAsyncResult.AsyncState进行接收。

需要注意的是 : 对于有Return(返回值)的异步调用函数,如何获得其返回值 : EndInvoke方法,值得注意的EndInvoke方法 : 可在异步调用结束后的回调函数中执行 ,也可以在异步调用代码后执行 : 只是这回当作是同步函数执行(异步函数被当作同步函数执行),理解为 , 现在就想拿到Return结果,所以停留在此,等待结果Return后,再往后面执行,相当于同步函数。


好了 , 结束废话 , 上正文:

1using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace AnycCallBack161005.com
{
    public class Anyc
    {
        private Dictionary<Action<int, int>, IAsyncResult> noReturnDic;
        private Dictionary<Func<int, int, int>, IAsyncResult> hasReturnDic;
 
        public Anyc()
        {
            this.noReturnDic = new Dictionary<Action<int, int>, IAsyncResult>();
            this.hasReturnDic = new Dictionary<Func<int, int, int>, IAsyncResult>();
        }
 
        public void DoAction(Action<int,int> callBack , int a , int b )
        {
            if(callBack != null)
            {
                if(this.noReturnDic.ContainsKey(callBack))
                {
                    callBack.EndInvoke(this.noReturnDic[callBack]);//强制执行上回的CallBack
                }
                this.noReturnDic[callBack] = callBack.BeginInvoke(a, b, this.DoActionComplete, callBack);
            }
        }
        private void DoActionComplete( IAsyncResult ar )
        {
            Action<int, int> callBack = ar.AsyncState as Action<int, int>;
            this.noReturnDic.Remove(callBack);
        }
 
        public void DoFunc( Func<int ,int , int> callBack , int a , int b )
        {
            if(callBack != null)
            {
                if(this.hasReturnDic.ContainsKey(callBack))
                {
                    int re = callBack.EndInvoke(this.hasReturnDic[callBack]);
                    Console.WriteLine("得到的结果为 {0} ", re);
                }
                this.hasReturnDic[callBack] = callBack.BeginInvoke(a,b,this.DoFuncComplete,callBack);
            }
        }
        private void DoFuncComplete(IAsyncResult ar)
        {
            Func<int, int, int> callBack = ar.AsyncState as Func<int, int, int>;
            int re = callBack.EndInvoke(ar);
            Console.WriteLine("得到的结果为* {0} ", re);
            this.hasReturnDic.Remove(callBack);
        }
    }
}

//调用代码 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AnycCallBack161005.com;
 
namespace AnycCallBack161005
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<int,int> testActionAnyc = ( a , b ) =>Console.WriteLine("Action得到的结果 : {0}",(a+b).ToString());
            Func<int, int,int> testFuncAnyc = (a, b) => a + b;
            Anyc anyc = new Anyc();
            anyc.DoAction(testActionAnyc, 3, 4);
            anyc.DoAction(testActionAnyc, 3, 5);
            anyc.DoAction(testActionAnyc, 3, 6);
            anyc.DoFunc(testFuncAnyc, 7, 8);
            anyc.DoAction(testActionAnyc, 3, 7);
            anyc.DoAction(testActionAnyc, 3, 8);
             
            Console.Read();
        }
    }
}

结果:

1.png

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:c# 特性Nächster Artikel:C#抓取ZigBee串口数据代码