Was den asynchronen Rückruf von C# betrifft, gibt es in ActionScript 3.0 das Schlüsselwort Function, und Sie können die Klassenfunktion direkt als Rückruffunktion übergeben. Aber in C# müssen Delegaten verwendet werden, und die am häufigsten verwendeten sind: Action/Func. Natürlich können Sie das Schlüsselwort Delegat verwenden, um den Delegaten anzupassen. Hier wird Action/Func als Beispiel verwendet, um den asynchronen Rückruf von C# zu erklären. Wenn Sie den Delegationsmechanismus von C# nicht verstehen, müssen Sie ihn zuerst auf Baidu/Google durchsuchen und dann diesen Blog lesen.
Die BeginInvoke-Methode wird verwendet, um einen asynchronen Aufruf zu starten. Sie verfügt über dieselben Parameter wie die Methode, die Sie asynchron ausführen müssen, mit der Ausnahme, dass es zwei zusätzliche Parameter gibt: den ersten: die Rückruffunktion nach Abschluss des asynchronen Aufrufs. Diese Funktion verfügt über einen Parameter: IAsyncResult. Das zweite ist das Statusobjekt, das jeden Wert übergeben und IAsyncResult.AsyncState verwenden kann, um ihn zu empfangen.
Was beachtet werden muss, ist: Wie man bei einer asynchronen Aufruffunktion mit einem Return (Rückgabewert) seinen Rückgabewert erhält: EndInvoke-Methode, die bemerkenswerte EndInvoke-Methode: kann in der Rückruffunktion nach dem ausgeführt werden Der asynchrone Aufruf endet. Es kann auch nach dem asynchronen Aufruf des Codes ausgeführt werden: Diesmal wird es nur als synchrone Funktionsausführung behandelt (die asynchrone Funktion wird als synchrone Funktion ausgeführt). Das Verständnis ist, dass Sie die Rückgabe erhalten möchten Ergebnis jetzt, Sie bleiben also hier und warten auf die Rückkehr des Ergebnisses. Es wird später ausgeführt und entspricht einer synchronen Funktion.
Okay, Schluss mit dem Unsinn, der Haupttext:
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); } } }
//Anrufcode:
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(); } } }
Ergebnis: