25.4.3 轮询
在之前的两种方法中,只能等待异步方法执行完毕,在完毕之前没有任何提示信息,整个程序就像没有响应一样,用户体验很不好。可以通过检查IAsyncResult类型的IsCompleted属性来检查异步调用是否完成了,如果没有完成,则可以适时地显示一些提示信息,这样用户体验会好很多,如代码清单25-6所示。
代码清单25-6 轮询
using System;
using System.Threading;
namespace ProgrammingCSharp4
{
class AsynchronousSample
{
public delegate void PrintDelegate(string content);
public static void Main()
{
int threadId=Thread.CurrentThread.ManagedThreadId;
PrintDelegate printDelegate=AsynchronousSample.Print;
Console.WriteLine(“[主线程id:{0}]\t开始调用打印方法……”,threadId);
IAsyncResult result=printDelegate.BeginInvoke("Hello World!",null,null);
while(!result.IsCompleted)
{
Console.WriteLine(".");
Thread.Sleep(500);
}
}
public static void Print(string content)
{
int threadId=Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(“[当前线程id:{0}]\t{1}”,threadId,content);
System.Threading.Thread.Sleep(2000);
Console.WriteLine(“[当前线程id:{0}]\t打印方法调用完毕.”,threadId);
}
}
}
上述代码的运行结果为:
[主线程id:1]开始调用打印方法……
.
[当前线程id:3]Hello World!
.
.
.
[当前线程id:3]打印方法调用完毕.
.
请按任意键继续……
图25-6演示了轮询方法。
图 25-6 轮询方法示意图