实际上,我很难理解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)我可以得到一些简单而漂亮的例子来更好地理解它吗?
发布于 2009-11-23 21:27:32
想象一下,你有一项很长的任务要做,而且一次只能做一件事。通常情况下,为了做到这一点,你必须停止做其他的事情。
// 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并查找操作结果。如果它还没有完成,它会一直阻塞,直到完成为止,这就是为什么你通常在回调中调用它。
这是一种经常在整个框架中使用的模式,而不仅仅是在函数委托上。像数据库连接、套接字之类的东西通常都有开始/结束对。
MSDN在这里有关于该模式的文档:http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
发布于 2009-11-23 21:07:57
BeginInvoke正在启动一个异步操作,EndInvoke正在等待该函数结束并返回结果。这是在C#中执行线程的另一种方式,最大的特点是begininvoke从线程池中获取线程,这对于Thread类是不正确的,另一个是你可以更简单的方式将参数和结果传递给线程函数。下面是一个http://ondotnet.com/pub/a/dotnet/2003/02/24/asyncdelegates.html示例
发布于 2009-11-23 21:09:16
我不知道如何很好地解释它,但这篇文章应该会有所帮助:
MSDN上的Asynchronous Programming Using Delegates
摘录:
.............If调用BeginInvoke方法时,公共语言运行库将请求排队并立即返回给调用方。在线程池中的线程上异步调用目标方法。提交请求的原始线程可以继续与目标方法并行执行。如果在对BeginInvoke方法的调用中指定了回调方法,则在目标方法结束时调用该回调方法。在回调方法中,EndInvoke方法获取返回值和任何输入/输出或仅输出参数。如果在调用BeginInvoke时未指定回调方法,则可以从调用BeginInvoke.....的线程调用EndInvoke
1)我们是否使用"EndInvoke()“来表示BeginInvoke()的结束”异步操作“?
不你用它来获取返回值或者..。见上文
2)这些对的实际用途是什么?
因此您可以对同步方法等进行异步调用
3)我可以得到一些简单而漂亮的例子来更好地理解它吗?
我很确定google可以比我做得更好。
https://stackoverflow.com/questions/1783031
复制相似问题