我曾经浏览过这个论坛来找到答案,但是这次我只是想不通什么使我完全理解以下问题。

我有这个程序:

IAsyncResult asrr;
        DELG d = (o) =>
        {
            short i = 10;
            string msg = (string)o;
            while (i > 0)
            {
                Console.WriteLine("Work - > {0}::{1}", i, msg);
                System.Threading.Thread.Sleep(1000);
                i--;
            }
        };
        asrr = d.BeginInvoke(((object)("T1")), (asr) =>
        {
            DELG dlg = (DELG)((System.Runtime.Remoting.Messaging.AsyncResult)asr).AsyncDelegate;
            dlg.EndInvoke(asr);
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("callback");
            Console.ForegroundColor = ConsoleColor.Gray;
        }, d);


然后我想我了解这里发生了什么:我们有一个使用asrr异步调用的委托。我们给委托人d提供了几个args:T1,将在委托中显示,一个回调方法(我使用lambda方法,因为在本练习中需要此方法)和委托d。

好吧,我真的不明白...我知道我们发送了T1,但“(asr)”来自何处?在begininvoke之后我什么也没得到,也没有什么:

DELG dlg = (DELG)((System.Runtime.Remoting.Messaging.AsyncResult)asr).AsyncDelegate;


再次在这里我可以看到asr,但听不懂。

我找到了此链接:
Delegates and Events
但是,尽管它对我有所帮助,但我仍然无法理解全部。
您能提供给我一些信息吗?

非常感谢收到的答案。

最佳答案

为了进一步增加他人的答案。

这是异步调用。

根据MSDN

BeginInvoke方法启动异步调用。它具有与要异步执行的方法相同的参数,以及两个其他可选参数。第一个参数是AsyncCallback委托,它引用异步调用完成时要调用的方法。第二个参数是用户定义的对象,该对象将信息传递到回调方法中。 BeginInvoke立即返回,并且不等待异步调用完成。 BeginInvoke返回一个IAsyncResult,可用于监视异步调用的进度。

EndInvoke方法检索异步调用的结果。可以在BeginInvoke之后的任何时间调用它。如果异步调用尚未完成,则EndInvoke会阻塞调用线程,直到完成为止。 EndInvoke的参数包括要异步执行的方法的outref参数(<Out> ByRef and ByRef in Visual Basic),以及IAsyncResult返回的BeginInvoke

查看链接以获取更多信息。

关于c# - 了解C#中的Begininvoke args,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19653645/

10-11 09:00