微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#异步操作

实际上,我很难理解BeginInvoke()和EndInvoke()对.

class AsynchronousDemo
{

    public delegate void DemoDelegate();
    static void Main()
    {

        DemoDelegate d = PrintA;

        IAsyncResult AResult = d.BeginInvoke(Callback,null);
        d.EndInvoke(AResult);
        Console.ReadKey(true);
    }

    static void PrintA()
    {
        Console.WriteLine("....Method in Print A Running ....");
        Thread.Sleep(4000);
        Console.WriteLine("....Method in Print A Completed...");
    }


    static void Callback(IAsyncResult ar)
    {
        Console.WriteLine("I will be finished after method A 
        completes its execution");
    }
}

1)我们使用“EndInvoke()”来表示BeginInvoke()的结束“异步操作”吗?

2)这对配对的实际用途是什么?

3)我可以得到一些简单而好的例子来更恰当地理解它吗?

解决方法

想象一下,你有很长的任务要做,而且一次只能做一件事.通常,为了做到这一点,你必须停止做其他事情.

// pseudocode
Main() {
    DoLaundry()
    GoAboutYourDay()
}

DoLaundry() {
    // boring parts here
}

现在想象一下,您希望能够在洗衣服的同时度过一天.一种解决方案是让别人去做.所以你把它带到一家清洁店,告诉他们该做什么,给他们你的衣服,并告诉他们完成后给你打电话.作为回报,他们会给你一张票,这样他们可以在你想要的时候再找到你的衣服.

// pseudocode
Main() {
   ticket = DoLaundry.BeginDoing(CallMeWhenDone)
   GoAboutYourDay()
   ticket.WaitUntilDone()
}

CallMeWhenDone(ticket) {
   cleanLaundry = DoLaundry.FinishDoing(ticket)
}

这是异步操作的工作原理.

BeginInvoke你告诉程序你需要做什么(委托),什么时候完成调用(回调),以及用什么来做(状态).您将返回IAsyncResult,这是您需要将其返回以便接收结果的对象.然后,您可以执行其他操作,或使用IAsyncResult中的WaitHandle进行阻止,直到操作完成.

回调:当异步操作完成时,它将调用方法,为您提供与以前相同的IAsyncResult.此时,您可以从中检索状态对象,或将IAsyncResult传递给EndInvoke.

EndInvoke:此函数接受IAsyncResult并查找操作的结果.如果还没有完成,它会阻塞直到它完成,这就是你通常在回调中调用它的原因.

这是一种经常在整个框架中使用的模式,而不仅仅是函数委托.数据库连接,套接字等都经常有Begin / End对.

MSDN上有关于模式的文档:http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐