C#多线程实现方法——异步委托/调用(一)

来源:互联网 发布:数码暴龙网络侦探透明 编辑:程序博客网 时间:2024/06/05 14:29

   小编最近在做项目中遇到了关于异步委托,刚开始很是蒙圈的东西,心里默默在想这是“啥玩意 啊”,不过经过一大堆努力后,整理了一下。

【例子】

首先我们来看一个简单的例子:

小明在烧水,等水烧开以后,将开水灌入热水瓶,然后开始整理家务
小文在烧水,在烧水的过程中整理家务,等水烧开以后,放下手中的家务活,将开水灌入热水瓶,然后继续整理家务
这也是日常生活中很常见的情形,小文的办事效率明显要高于小明。从C#程序执行的角度考虑,小明使用的同步处理方式,而小文则使用的异步处理方式。
同步处理方式下,事务是按顺序一件一件处理的;而异步方式则是,将子操作从主操作中分离出来,主操作继续进行,子操作在完成处理的时候通知主操作。

【异步委托】

我们通过异步委托来完成:

class BoilWater    {        static TimeSpan Boil()        {            Console.WriteLine("水壶:开始烧水...");            Thread.Sleep(6000);            Console.WriteLine("水壶:水已经烧开了!");            return TimeSpan.MinValue;        }        delegate TimeSpan BoilingDelegate();        static void Main(string[] args)        {            Console.WriteLine("小文:将水壶放在炉子上");            BoilingDelegate d = new BoilingDelegate(Boil);            IAsyncResult result = d.BeginInvoke(BoilingFinishedCallback, null);            Console.WriteLine("小文:开始整理家务...");            for (int i = 0; i < 20; i++)            {                Console.WriteLine("小文:整理第{0}项家务...", i + 1);                Thread.Sleep(1000);            }        }        static void BoilingFinishedCallback(IAsyncResult result)        {            AsyncResult asyncResult = (AsyncResult)result;            BoilingDelegate del = (BoilingDelegate)asyncResult.AsyncDelegate;            del.EndInvoke(result);            Console.WriteLine("小文:将热水灌到热水瓶");            Console.WriteLine("小文:继续整理家务");        }       }
效果图: