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.4.3 轮询 - 图1

图 25-6 轮询方法示意图