using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
// 委托 异步调用
namespace Donis.CSharpBook
{
public delegate void DelegateClass();
public class Starter
{
static void Main(string[] args)
{
DelegateClass del = MethodA;
DelegateStateBag state = new DelegateStateBag();
IAsyncResult ar = del.BeginInvoke(Callback, state);
if (ar.IsCompleted == true) // 主线程
{
Console.WriteLine("MethodA completed");
}
else
{
Console.WriteLine("MethodA not completed");
}
ar.AsyncWaitHandle.WaitOne();
// doing something else
Thread.Sleep(100);
lock(state){
Console.WriteLine("Back in Main");
Console.WriteLine(state.message);
}
}
public static void Callback(IAsyncResult ar){
DelegateStateBag state = (DelegateStateBag)ar.AsyncState;
lock(state){
Console.WriteLine("Callback running");
((DelegateStateBag)ar.AsyncState).message = "State object modified in callback";
}
}
public static void MethodA(){
Console.WriteLine("MethodA running...");
Thread.Sleep(200);
}
}
class DelegateStateBag{
public string message;
}
}
运行结果:
MethodA not completed
MethodA running...
Callback running
Back in Main
State object modified in callback
说明:
IAsyncResult ar = del.BeginInvoke(Callback, state);启动了两个线程,一个是主线程,一个是委托del(即MethodA)线程。委托del线程运行结束后回调Callback,此时还是两个线程在运行。state作为参数传递给Callback。