加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#异步操作

发布时间:2020-12-15 19:33:43 所属栏目:百科 来源:网络整理
导读:实际上,我很难理解BeginInvoke()和EndInvoke()对. class AsynchronousDemo{ public delegate void DemoDelegate(); static void Main() { DemoDelegate d = PrintA; IAsyncResult AResult = d.BeginInvoke(Callback,null); d.EndInvoke(AResult); Console.Re
实际上,我很难理解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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读