本文共 4020 字,大约阅读时间需要 13 分钟。
微软docs上的例子,可以参考学习:
https://docs.microsoft.com/en-us/dotnet/api/system.delegate.getinvocationlist?view=netframework-4.5C#using System;using System.IO;using System.Reflection;using System.Windows.Forms;public class Example{ public static void Main() { ActionoutputMessage = null; outputMessage += Console.WriteLine; outputMessage += OutputToFile; outputMessage += ShowMessageBox;// Dim output1 As Action(Of String) = AddressOf Console.WriteLine// Dim output2 As Action(Of String) = AddressOf OutputToFile// Dim output3 As Action(Of String) = AddressOf MessageBox.Show//// outputMessage = [Delegate].Combine( { output1, output2, output3 } ) Console.WriteLine("Invocation list has {0} methods.", outputMessage.GetInvocationList().Length); // Invoke delegates normally. outputMessage("Hello there!"); Console.WriteLine("Press to continue..."); Console.ReadLine(); // Invoke each delegate in the invocation list in reverse order. for (int ctr = outputMessage.GetInvocationList().Length - 1; ctr >= 0; ctr--) { var outputMsg = outputMessage.GetInvocationList()[ctr]; outputMsg.DynamicInvoke("Greetings and salutations!"); } Console.WriteLine("Press to continue..."); Console.ReadLine(); // Invoke each delegate that doesn't write to a file. for (int ctr = 0; ctr < outputMessage.GetInvocationList().Length; ctr++) { var outputMsg = outputMessage.GetInvocationList()[ctr]; if (! outputMsg.GetMethodInfo().Name.Contains("File")) outputMsg.DynamicInvoke( new String[] { "Hi!" } ); } } private static void OutputToFile(String s) { var sw = new StreamWriter(@".\output.txt"); sw.WriteLine(s); sw.Close(); } private static void ShowMessageBox(String s) { MessageBox.Show(s); }}
VB:Imports System.IOImports System.ReflectionImports System.Windows.FormsModule Example Public outputMessage As Action(Of String) Public Sub Main() Dim output1 As Action(Of String) = AddressOf Console.WriteLine Dim output2 As Action(Of String) = AddressOf OutputToFile Dim output3 As Action(Of String) = AddressOf MessageBox.Show outputMessage = [Delegate].Combine( { output1, output2, output3 } ) Console.WriteLine("Invocation list has { 0} methods.", outputMessage.GetInvocationList().Count) ' Invoke delegates normally. outputMessage("Hello there!") Console.WriteLine("Pressto continue...") Console.ReadLine() ' Invoke each delegate in the invocation list in reverse order. For ctr As Integer = outputMessage.GetInvocationList().Count - 1 To 0 Step -1 Dim outputMsg = outputMessage.GetInvocationList(ctr) outputMsg.DynamicInvoke("Greetings and salutations!") Next Console.WriteLine("Press to continue...") Console.ReadLine() ' Invoke each delegate that doesn't write to a file. For ctr As Integer = 0 To outputMessage.GetInvocationList().Count - 1 Dim outputMsg = outputMessage.GetInvocationList(ctr) If Not outputMsg.GetMethodInfo().Name.Contains("File") Then outputMsg.DynamicInvoke( { "Hi!" } ) End If Next End Sub Private Sub OutputToFile(s As String) Dim sw As New StreamWriter(".\output.txt") sw.WriteLine(s) sw.Close() End SubEnd Module另外一个例子,委托事件返回的类型是Task: Public Sub Main() Dim action As Func(Of String, Task) = AddressOf upload Dim action1 As Func(Of String, Task) = AddressOf upload1 Dim delegateComb = [Delegate].Combine({action, action1}) Await delegateComb.DynamicInvoke(autoCommand) End Sub Private Async Function upload1(ByVal msg As String) As Task Await Task.Delay(3000) End Function Private Async Function upload2(ByVal msg As String) As Task Await Task.Delay(3000) End Function
转载地址:http://ksmdi.baihongyu.com/