C#使用delegate异步执行技巧
发布时间:2021-11-24 15:34:32 所属栏目:PHP教程 来源:互联网
导读:在另外一个线程执行一个函数有很多种方法,这里讨论的是使用delegate的BeginInvoke方法,它的好处是在另一个线程中调用了函数,而且不用花费太多的开销。 下面是使用delegate异步执行方法的示例: [csharp] class Program { static void Main(string[] args)
在另外一个线程执行一个函数有很多种方法,这里讨论的是使用delegate的BeginInvoke方法,它的好处是在另一个线程中调用了函数,而且不用花费太多的开销。 下面是使用delegate异步执行方法的示例: [csharp] class Program { static void Main(string[] args) { object syncObject = new object(); Test test = new Test(); int index = 0; AutoResetEvent signal = new AutoResetEvent(false); for (int i = 0; i < 10; i++) { test.BeginDoAction(delegate(object sender, EventArgs e) { lock (syncObject) { Interlocked.Increment(ref index); if (index == 10) signal.Set(); Console.WriteLine("Receive result."); } }); } Console.WriteLine("Waiting signal."); signal.WaitOne(); Console.WriteLine("Signaled."); Console.ReadLine(); } } public delegate int GetDelegate(); class Test { private EventHandler<EventArgs> callbackCompleted; public void BeginDoAction(EventHandler<EventArgs> pCallbackCompleted) { Console.WriteLine("Begin do action."); callbackCompleted = pCallbackCompleted; AsyncCallback callback = OnCompleted; GetDelegate getDelegate = DoAction; getDelegate.BeginInvoke(callback, null); } public int DoAction() { Console.WriteLine("Do action"); Thread.Sleep(20000); return 1; } private void OnCompleted(IAsyncResult result) { GetDelegate getDelegate = ((AsyncResult)result).AsyncDelegate as GetDelegate; int print = getDelegate.EndInvoke(result); if (callbackCompleted != null) callbackCompleted(this, EventArgs.Empty); } } 最终显示结果如下,说明函数被异步调用。 delegate是在另一个线程上异步执行一个方法的一种方式,但是它的使用也有一定的局限,由于delegate实际上是使用thread pool进行异步执行的,因此thread pool本身就成了这种调用方式的制约,比方说thread pool的尺寸或者其所能执行的线程数等等。因此并不是所有的异步方法调用都适合用delegate方式调用。 ![]() (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |