class Program
{
public delegate int TakesAwhiledelegate(int data, int ms);
static int TakesAwhile(int data, int ms)
{
Console.WriteLine("TakeStart");
Thread.Sleep(ms);
Console.WriteLine("Completed");
return ++data;
}
static void Main(string[] args)
{
showcallback();
}
#region 异步委托
/// <summary>
/// 异步委托
/// </summary>
static void Show()
{
TakesAwhiledelegate dl = TakesAwhile;
IAsyncResult ar = dl.BeginInvoke(1, 2000, null, null);
if (!ar.IsCompleted)
{
Console.Write(".");
Thread.Sleep(50);
}
int result = dl.EndInvoke(ar);
Console.WriteLine(result);
Console.Read();
}
#endregion
#region 等待句柄
/// <summary>
/// 等待句柄
/// </summary>
static void showwait()
{
TakesAwhiledelegate dl = TakesAwhile;
IAsyncResult aw = dl.BeginInvoke(1, 3000, null, null);
while (true)
{
Console.WriteLine(".");
if (aw.AsyncWaitHandle.WaitOne(50, false))
{
Console.WriteLine(" can no wait for Results!");
break;
}
}
int result = dl.EndInvoke(aw);
Console.WriteLine("Result:{0}", result);
Console.Read();
}
#endregion
#region 异步回调
#region 普通实现
//异步回调
static void showcallback()
{
TakesAwhiledelegate dl = TakesAwhile;
dl.BeginInvoke(1, 3000, TakeAwhileCompleted, dl);
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
}
Console.Read();
}
//这个方法从委托线程中调用 而不是从主线程中调用
static void TakeAwhileCompleted(IAsyncResult ar)
{
if (ar == null) throw new ArgumentNullException("ar");
TakesAwhiledelegate dl = ar.AsyncState as TakesAwhiledelegate;
Trace.Assert(dl != null, "Invalid object type");
int result = dl.EndInvoke(ar);
Console.WriteLine("Result:{0}", result);
Console.ReadLine();
}
#endregion
#region Lambda实现
static void showLambda()
{
TakesAwhiledelegate dl = TakesAwhile;
dl.BeginInvoke(1, 3000, ar => {
int result = dl.EndInvoke(ar);
Console.WriteLine("Result:", result);
}, null);
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
}
}
#endregion
#endregion
}
代码来自书上。。。