首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#异步操作

C#异步操作
EN

Stack Overflow用户
提问于 2009-11-23 21:02:50
回答 4查看 2.5K关注 0票数 3

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

代码语言:javascript
复制
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)我可以得到一些简单而漂亮的例子来更好地理解它吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-23 21:27:32

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

代码语言:javascript
复制
// pseudocode
Main() {
    DoLaundry()
    GoAboutYourDay()
}

DoLaundry() {
    // boring parts here
}

现在想象一下,你想要在洗衣服的同时继续你的一天。一个解决方案是让别人来做这件事。所以你把它带到一家清洁店,告诉他们该做什么,把你的衣服给他们,然后告诉他们在洗好衣服后给你打电话。作为回报,他们会给你一张票,这样当你想要回你的衣服时,他们就可以再次找到你的衣服。

代码语言:javascript
复制
// pseudocode
Main() {
   ticket = DoLaundry.BeginDoing(CallMeWhenDone)
   GoAboutYourDay()
   ticket.WaitUntilDone()
}

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

这就是异步操作的工作方式。

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

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

EndInvoke:此函数获取IAsyncResult并查找操作结果。如果它还没有完成,它会一直阻塞,直到完成为止,这就是为什么你通常在回调中调用它。

这是一种经常在整个框架中使用的模式,而不仅仅是在函数委托上。像数据库连接、套接字之类的东西通常都有开始/结束对。

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

票数 11
EN

Stack Overflow用户

发布于 2009-11-23 21:07:57

BeginInvoke正在启动一个异步操作,EndInvoke正在等待该函数结束并返回结果。这是在C#中执行线程的另一种方式,最大的特点是begininvoke从线程池中获取线程,这对于Thread类是不正确的,另一个是你可以更简单的方式将参数和结果传递给线程函数。下面是一个http://ondotnet.com/pub/a/dotnet/2003/02/24/asyncdelegates.html示例

票数 1
EN

Stack Overflow用户

发布于 2009-11-23 21:09:16

我不知道如何很好地解释它,但这篇文章应该会有所帮助:

MSDN上的Asynchronous Programming Using Delegates

摘录:

.............If调用BeginInvoke方法时,公共语言运行库将请求排队并立即返回给调用方。在线程池中的线程上异步调用目标方法。提交请求的原始线程可以继续与目标方法并行执行。如果在对BeginInvoke方法的调用中指定了回调方法,则在目标方法结束时调用该回调方法。在回调方法中,EndInvoke方法获取返回值和任何输入/输出或仅输出参数。如果在调用BeginInvoke时未指定回调方法,则可以从调用BeginInvoke.....的线程调用EndInvoke

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

不你用它来获取返回值或者..。见上文

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

因此您可以对同步方法等进行异步调用

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

我很确定google可以比我做得更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1783031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档