【问题标题】:Understanding of Begininvoke args in C#C#中Begininvoke args的理解
【发布时间】:2013-10-29 08:57:16
【问题描述】:

我过去常常浏览这个论坛来寻找答案,但这次我想不出任何能让我完全理解以下问题的东西。

我有这个程序:

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”几个参数:T1,将在委托中显示,一个回调方法(我使用 lambda 方法,因为在本练习中需要它)和 d,委托。

好吧,我真的不明白...我知道我们发送 T1 但“(asr)”从哪里来?我没有得到 begininvoke 之后发生的任何事情,也没有得到什么:

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

这里我又可以看到 asr 但不明白。

我找到了这个链接: Delegates and Events 但即使它帮助了我,我仍然没有得到它的全部。 请您提供一些有关它的信息吗?

非常感谢收到的答案。

【问题讨论】:

  • 找到答案后,请将其标记为答案。以便其他人也可以使用它。

标签: c# asynchronous delegates begininvoke


【解决方案1】:

进一步补充其他人的答案。

这是异步调用。

根据MSDN

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

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

查看链接了解更多信息。

【讨论】:

  • 这正是我一直在等待的答案。非常感谢您这么清楚并抽出宝贵的时间!
  • 很高兴,您得到了答案。
【解决方案2】:

您在BeginInvoke 调用中声明asr - 具有(asr) => 的部分是声明。类型是推断出来的。

【讨论】:

  • 我想他问的是asr的价值从何而来。
【解决方案3】:

asr 是匿名委托的输入参数。 请参阅http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx 了解更多信息。

委托有一个带有一个输入参数的签名。在大括号之间的函数块中声明输入参数为asr

【讨论】:

  • 感谢您提供这些信息。但是这个输入参数不就是之前的“((object)(”T1“))”吗?所以我明白 asr 是在被分配 lambda 函数时直接创建的,但对我来说,它似乎是发送给委托的第二个参数。
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2012-11-30
  • 2020-08-04
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多