如何使用MethodInvoker委托在cli c ++中同步对控件线程的调用

时间:2012-12-20 16:42:16

标签: c# c++ visual-studio-2005 command-line-interface

我有一个c#但代码,我需要它在cli / c ++中,但总是我得到这个错误

  

“错误2错误C2955:'BaseLibCS :: MethodInvoker':使用类   generic需要泛型参数列表“

     

“错误4错误C2664:   “BaseLibCS :: MethodInvoker :: MethodInvoker(系统::字符串   ^,... cli :: array ^)':无法转换参数1   'GetNotifications ^ const'到'System :: String ^'“

     

“错误3错误C2102:'&'需要l值“

     

“错误1错误C2872:'MethodInvoker':模糊符号”

这是我的c#代码:

private void HandleFarmStateChanged(object sender, ValueChangedEventArgs<CFarm.FarmState> e)
        {
            if (control.InvokeRequired)
            {
                control.Invoke(new MethodInvoker(delegate
                {
                    HandleFarmStateChanged(sender, e);
                }));
                return;
            }

           //FarmStateStatusLabel.Text = e.NewValue.ToString();
            Console.WriteLine(e.NewValue.ToString());
            Console.WriteLine("       ");
        }

这是我的c ++代码:

void GetNotifications::HandleFarmStateChanged(Object ^sender, ValueChangedEventArgs<CFarm::FarmState> ^e)
{
    if (control->InvokeRequired)
            {
                control->Invoke(gcnew MethodInvoker(this,&GetNotifications::HandleFarmStateChanged(sender, e)));
                //}));
                return;
            }

    Console::WriteLine(e->NewValue.ToString());
    Console::WriteLine("       ");
}

1 个答案:

答案 0 :(得分:2)

经过一天的研究我发现了问题,这是因为C ++ / CLI不支持匿名委托,这是一个独特的C#功能。您需要在类的单独方法中编写委托目标方法。您还需要声明委托类型,MethodInvoker无法完成工作。

很多,并度过了愉快的一天