none
MethodInvoker类的问题 RRS feed

  • 问题

  • 在百度上和MSDN上查了MethodInvoker

    在百度知道上有一个例子提到MethodInvoker,但是它的解析也是很模糊,请问MethodInvoker具体怎么用,感觉多线程里跟UI线程通讯有很多限制

    G_th = new System.Threading.Thread( //新建一条线程
                    delegate()//使用匿名方法
                    {
                        int P_int_count = 0;//初始化计数器
                        while (true)//开始无限循环
                        {
                            P_int_count = //计数器累加
                                ++P_int_count > 100000000 ? 0 : P_int_count;
                            this.Invoke(//将代码交给主线程执行
                                (MethodInvoker)delegate//使用匿名方法
                                {
                                    lb_time.Text = //窗体中显示计数
                                        P_int_count.ToString();
                                });
                            System.Threading.Thread.Sleep(1000);//线程睡眠1秒
                        }
                    });

    MethodInvoker是什么?
        // MethodInvoker的定义:
        //     表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。
        public delegate void MethodInvoker();
    上面提到的Dlg类型与MethodInvoker定义的方法签名相同, 所以MethodInvoker类型变量与可以与Dlg类型变量互相cast

    2011年8月10日 14:01

答案

  • 只是一个委托, 我们可以认为所有没有参数的返回值为void的委托和 MethodInvoker 是一样的, 他们都可以委托到没有参数的返回值为void的方法。

    你自己写一个 Public Delegate Sub ABC, 这个时候ABC和MethodInvoker是完全一样的。所以.Net 提供这个只是为了方便你编写,省得你自己再写一堆一样的委托了。

    Action<T>、Func<T,TResult>这些都是都是预定义好的委托,不过我们可以通过泛型来指定他们的参数的类型,。Net为我们已经定义了很多个Action,有没有参数的,一个参数的,两个的也有很多个的,看 http://msdn.microsoft.com/zh-cn/library/018hxwa8.aspx

    Func<T,TResult>一样,只是他多了一个返回值,我们可以通过泛型指定他的委托返回值类型。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月10日 17:06
    版主

全部回复

  • 在博客园里看到这句话:请用Framework内置的泛型的委托Action、Func,代替自己定义新委托类型

    实际上内置的泛型的委托Action、Func具体怎么用我不是很清楚,网上资料很少

    2011年8月10日 15:06
  • 只是一个委托, 我们可以认为所有没有参数的返回值为void的委托和 MethodInvoker 是一样的, 他们都可以委托到没有参数的返回值为void的方法。

    你自己写一个 Public Delegate Sub ABC, 这个时候ABC和MethodInvoker是完全一样的。所以.Net 提供这个只是为了方便你编写,省得你自己再写一堆一样的委托了。

    Action<T>、Func<T,TResult>这些都是都是预定义好的委托,不过我们可以通过泛型来指定他们的参数的类型,。Net为我们已经定义了很多个Action,有没有参数的,一个参数的,两个的也有很多个的,看 http://msdn.microsoft.com/zh-cn/library/018hxwa8.aspx

    Func<T,TResult>一样,只是他多了一个返回值,我们可以通过泛型指定他的委托返回值类型。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月10日 17:06
    版主
  • 需要调用一个带参数的方法呢,将会是怎么样的情况呢?就像这样:
    private void MultiParams(string text, int number, DateTime dateTime);

    这也不是什么麻烦,因为委托(delegate)能够访问外部变量,所以你能这样改写:

    private void SetTextDelegatePatternParams(string text, int number, DateTime datetime)
    {
    if (this.InvokeRequired)
    {
    MethodInvoker del = delegate {
    SetTextDelegatePatternParams(text, number, datetime); };
    this.Invoke(del);
    return;
    }
    MultiParams(text, number, datetime);
    }

    它这里methodinvoker委托有参数的方法,请问这个是什么问题,bobbao大侠

    2011年8月11日 1:57
  • 那就用 Action<string, int, DateTime>

     

    你这里可以这么写 this.Invoke(new Action<string, int, DateTime>(SetTextDelegatePatternParams, text, number, datetime);

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月11日 2:16
    版主
  • 好像C#2.0没有Func<> 委托,Action<>也只有Action<T>委托

    2011年8月11日 3:01
  • private void SetTextDelegatePatternParams(string text,int number, DateTime datetime)
    {
    if (this.InvokeRequired)
    {
    MethodInvoker del = delegate {
    SetTextDelegatePatternParams(text, number, datetime); };
    this.Invoke(del);
    return;
    }
    MultiParams(text, number, datetime);
    }

    这段代码没有问题可以运行在。net2.0里面

    2011年8月11日 3:09
  • C#3.0里的许多新特性很多没有理解不好意思

    我之前做实验的时候是这样写的:

                Action<int, int> actionInt = p.ShowString;
                actionInt(2, 2);

            void ShowString(int i1,int i2)
            {
                Console.WriteLine("{0}",i1+i2);
            }

    2011年8月11日 3:12
  • private void SetTextDelegatePatternParams(string text,int number, DateTime datetime)
    {
    if (this.InvokeRequired)
    {
    MethodInvoker del = delegate {
    SetTextDelegatePatternParams(text, number, datetime); };
    this.Invoke(del);
    return;
    }
    MultiParams(text, number, datetime);
    }

    这段代码没有问题可以运行在。net2.0里面


    是的,你的代码是可以的,你用MethodInvoker委托了一个匿名delegate然后在里面call了SetTextDelegatePatternParams方法。但是你可以写得更好,比如自己声明一个含有三个参数string, int, DateTime的委托,然后使用它去直接调用SetTextDelegatePatternParams方法。

     

    public delegate void MyMethodInvoker(string text, int number, DateTime dt);
    
    ...
    
    this.Invoke(new MyMethodInvoker(SetTextDelegatePatternParams, text, number, datetime);
    


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月11日 3:23
    版主
  • 好像C#2.0没有Func<> 委托,Action<>也只有Action<T>委托

    您好,是的。

    由于4.0以前的版本有很多近似的委托定义,除了委托名外,参数和返回值都一样。所以为了减少混乱,在4.0中做了整理和简化。

    其结果就是现在看到的Action和Func。

    个人认为Bob Bao已回答了您的提问,如有其它问题请继续讨论。谢谢!


    2011年8月14日 3:53
    版主
  • 不是哦,我用的是2.0
    2011年8月14日 7:53
  • private void SetTextDelegatePatternParams(string text,int number, DateTime datetime)
    {
    if (this.InvokeRequired)
    {
    MethodInvoker del = delegate {
    SetTextDelegatePatternParams(text, number, datetime); };
    this.Invoke(del);
    return;
    }
    MultiParams(text, number, datetime);
    }

    这段代码没有问题可以运行在。net2.0里面


    是的,你的代码是可以的,你用MethodInvoker委托了一个匿名delegate然后在里面call了SetTextDelegatePatternParams方法。但是你可以写得更好,比如自己声明一个含有三个参数string, int, DateTime的委托,然后使用它去直接调用SetTextDelegatePatternParams方法。

     

    public delegate void MyMethodInvoker(string text, int number, DateTime dt);
    
    ...
    
    this.Invoke(new MyMethodInvoker(SetTextDelegatePatternParams, text, number, datetime);
    

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    根据二楼的说法:我们可以认为所有没有参数的返回值为void的委托和 MethodInvoker 是一样的,怎麽可以带参数?
    2011年8月14日 7:57