>类库下载 >C#类库 >C# 비동기 콜백 함수

C# 비동기 콜백 함수

高洛峰
高洛峰원래의
2016-10-13 16:15:562913검색

C#의 비동기 콜백의 경우 ActionScript 3.0에는 Function이라는 키워드가 있는데, 클래스 함수를 콜백 함수로 직접 전달할 수 있습니다. 하지만 C#에서는 대리자를 사용해야 하며 가장 일반적으로 사용되는 것은 Action / Func입니다. 물론 대리자 키워드를 사용하여 대리자를 사용자 정의할 수 있습니다. 여기서는 Action/Func를 예로 들어 C#의 비동기 콜백을 설명합니다. C#의 위임 메커니즘을 이해하지 못하는 경우 먼저 Baidu/Google에서 검색한 후 이 블로그를 읽어보세요.



BeginInvoke 메서드는 비동기 호출을 시작하는 데 사용됩니다. 여기에는 두 개의 추가 매개변수가 있다는 점을 제외하고 비동기식으로 실행하는 데 필요한 메서드와 동일한 매개변수가 있습니다. 첫 번째: 비동기 호출이 완료된 후의 콜백 함수 이 함수에는 IAsyncResult라는 하나의 매개변수가 있습니다. 두 번째는 모든 값을 전달하고 IAsyncResult.AsyncState를 사용하여 이를 수신할 수 있는 상태 개체입니다.

주의해야 할 점은 다음과 같습니다. Return(반환 값)이 있는 비동기 호출 함수의 경우 반환 값을 얻는 방법: EndInvoke 메서드, 주목할만한 EndInvoke 메서드: 다음 콜백 함수에서 실행할 수 있습니다. 비동기 호출이 끝나면 코드를 비동기적으로 호출한 후에 실행할 수도 있습니다. 이번에는 동기 함수 실행으로 처리됩니다(비동기 함수는 동기 함수로 실행됨). 지금은 결과가 반환되므로 여기에 머물면서 결과가 반환될 때까지 기다립니다. 이는 동기 함수와 동일합니다.


알겠습니다. 쓸데없는 소리는 그만하세요. 본문:

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();
        }
    }
}

결과:

C# 비동기 콜백 함수

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:C# 기능다음 기사:C# 기능