110,536
社区成员
发帖
与我相关
我的任务
分享
sing System;
using System.Threading;
// 定义异步调用方法的委托
// 它的签名必须与要异步调用的方法一致
public delegate int AsynComputeCaller(ulong l, out ulong factorial);
public class Factorial
{
// 计算阶乘
public ulong Compute(ulong l)
{
// 模拟耗时的计算
Thread.Sleep(50);
if (l == 1)
{
return 1;
}
else
{
return l * Compute(l - 1);
}
}
// 要异步调用的方法
// 1. 调用Factorial方法来计算阶乘,并用out参数返回
// 2. 统计计算阶乘所用的时间,并返回该值
public int AsynCompute(ulong l, out ulong factorial)
{
Console.WriteLine("开始异步方法");
DateTime startTime = DateTime.Now;
factorial = Compute(l);
TimeSpan usedTime = new TimeSpan(DateTime.Now.Ticks - startTime.Ticks);
Console.WriteLine("结束异步方法");
return usedTime.Milliseconds;
}
}
public class Test
{
public static void Main()
{
// 创建包含异步方法的类的实例
Factorial fact = new Factorial();
// 创建异步委托
AsynComputeCaller caller = new AsynComputeCaller(fact.AsynCompute);
// 启动异步调用
Console.WriteLine("启动异步调用");
ulong l = 30;
ulong lf;
IAsyncResult result = caller.BeginInvoke(l, out lf, null, null);
// 主线程进行一些操作
Thread.Sleep(0);
Console.WriteLine("主线程进行一些操作");
// 等待WaitHandle接收到信号
Console.WriteLine("等待WaitHandle接收到信号");
result.AsyncWaitHandle.WaitOne();//阻止主线程,直到EnInvoke执行完毕!
// 主线程进行一些操作
Thread.Sleep(0);
Console.WriteLine("异步方法已经结束,主线程进行另外一些操作");
// 调用EndInvoke来获得结果
int returnValue = caller.EndInvoke(out lf, result);
// 异步调用的方法已经结束,显示结果
Console.WriteLine("已经得到结果:{0}的阶乘为{1},计算时间为{2}毫秒", l, lf, returnValue);
Console.Read();
}
}