关于C#委托的三种调用方式,分别是:直接调用、使用BeginInvoke/EndInvoke方法异步调用、使用线程池异步调用。下面逐一进行详细讲解。
直接调用
直接调用是指在委托实例后面直接加上小括号和对应参数,就相当于调用了委托所指向的方法。示例代码如下:
using System;
namespace DelegateDemo
{
class Program
{
delegate void SayHelloDelegate(string name);
static void Main(string[] args)
{
SayHelloDelegate sayHelloDelegate = new SayHelloDelegate(SayHello);
sayHelloDelegate("Jack");
}
static void SayHello(string name)
{
Console.WriteLine($"Hello, {name}!");
}
}
}
在上面的代码中,我们定义了一个委托类型SayHelloDelegate
,并在Main
方法中创建了一个委托实例sayHelloDelegate
,然后直接调用了委托所指向的方法SayHello
。
使用BeginInvoke/EndInvoke方法异步调用
使用BeginInvoke
和EndInvoke
方法可以异步调用委托所指向的方法,并且可以获取异步调用结果。示例代码如下:
using System;
using System.Threading;
namespace DelegateDemo
{
class Program
{
delegate int CalculateDelegate(int a, int b);
static void Main(string[] args)
{
CalculateDelegate calculateDelegate = new CalculateDelegate(Calculate);
IAsyncResult asyncResult = calculateDelegate.BeginInvoke(10, 5, null, null);
Console.WriteLine("异步调用已启动");
while (!asyncResult.IsCompleted)
{
Console.WriteLine("正在等待异步调用结束");
Thread.Sleep(1000);
}
int result = calculateDelegate.EndInvoke(asyncResult);
Console.WriteLine($"异步调用结果:{result}");
}
static int Calculate(int a, int b)
{
Console.WriteLine($"正在计算{a} + {b}...");
Thread.Sleep(5000);
int result = a + b;
Console.WriteLine($"计算结果为{result}");
return result;
}
}
}
在上面的代码中,我们定义了一个委托类型CalculateDelegate
,并在Main
方法中创建了一个委托实例calculateDelegate
。然后,我们使用BeginInvoke
方法异步调用了委托所指向的方法Calculate
,并在等待异步调用结束时输出一些提示信息。最后,我们使用EndInvoke
方法获取异步调用的结果并输出到控制台。
使用线程池异步调用
使用线程池异步调用可以避免创建过多的线程,提高应用程序的性能。示例代码如下:
using System;
using System.Threading;
namespace DelegateDemo
{
class Program
{
delegate void SayHelloDelegate(string name);
static void Main(string[] args)
{
SayHelloDelegate sayHelloDelegate = new SayHelloDelegate(SayHello);
ThreadPool.QueueUserWorkItem(new WaitCallback(sayHelloDelegate.Invoke), "Jack");
Console.WriteLine("异步调用已启动");
Console.ReadLine();
}
static void SayHello(string name)
{
Console.WriteLine($"Hello, {name}!");
}
}
}
在上面的代码中,我们使用ThreadPool.QueueUserWorkItem
方法异步调用了委托所指向的方法SayHello
,并在输出一些提示信息后等待用户输入。需要注意的是,线程池至少会等待程序运行15秒钟,才会真正结束程序。如果想要立即结束程序,可以在控制台中按下任意键。
到这里为止,关于C#委托三种调用方式的详细讲解就结束了。如果有任何疑问或者需要进一步的帮助,请随时联系我。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于C#委托三种调用的分享使用 - Python技术站