实际上,我很难理解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");
}
}
Run Code Online (Sandbox Code Playgroud)
1)我们使用"EndInvoke()"来表示BeginInvoke()的结束"异步操作"吗?
2)这对配对的实际用途是什么?
3)我可以得到一些简单而好的例子来更恰当地理解它吗?
Ale*_*x J 11
想象一下,你有很长的任务要做,而且一次只能做一件事.通常,为了做到这一点,你必须停止做其他事情.
// pseudocode
Main() {
DoLaundry()
GoAboutYourDay()
}
DoLaundry() {
// boring parts here
}
Run Code Online (Sandbox Code Playgroud)
现在想象一下,您希望能够在洗衣服的同时度过一天.一种解决方案是让别人去做.因此,您将它带到清洁店,告诉他们该做什么,给他们你的衣服,并告诉他们完成后打电话给你.作为回报,他们会给你一张票,这样他们可以在你想要的时候再找到你的衣服.
// pseudocode
Main() {
ticket = DoLaundry.BeginDoing(CallMeWhenDone)
GoAboutYourDay()
ticket.WaitUntilDone()
}
CallMeWhenDone(ticket) {
cleanLaundry = DoLaundry.FinishDoing(ticket)
}
Run Code Online (Sandbox Code Playgroud)
这是异步操作的工作原理.
BeginInvoke你告诉程序你需要做什么(委托),什么时候完成调用(回调),以及用什么来做(状态).您将返回IAsyncResult,这是您需要将其返回以便接收结果的对象.然后,您可以执行其他操作,或使用IAsyncResult中的WaitHandle进行阻止,直到操作完成.
回调:当异步操作完成时,它将调用此方法,为您提供与以前相同的IAsyncResult.此时,您可以从中检索状态对象,或将IAsyncResult传递给EndInvoke.
EndInvoke:此函数接受IAsyncResult并查找操作的结果.如果还没有完成,它会阻塞直到它完成,这就是你通常在回调中调用它的原因.
这是一种经常在整个框架中使用的模式,而不仅仅是函数委托.数据库连接,套接字等都经常有Begin/End对.
MSDN上有关于模式的文档:http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
归档时间: |
|
查看次数: |
2479 次 |
最近记录: |