你如何在.Net C ++中代理一个代表

时间:2011-06-21 23:41:43

标签: .net delegates c++-cli

这是关于从另一个线程更新UI的系列中的第二个问题。我试图使用委托告诉UI执行更新功能(不需要传递数据)。我在UI线程中创建了一个委托,并在UI线程上声明了它:

delegate void MyDel();
public ref class Form1 : public System::Windows::Forms::Form
{
    // .....
    void testFunc()
    {
       this->local_long_textBox->Text = "Test!!!!!!!";
    }
private:
    void startUp()
    {
       MyDel^ DelInst = gcnew MyDel(this,&CotStinger::Form1::testFunc);

我想在创建时将DelInst传递给另一个线程,但是当我尝试在另一个模块的顶部将MyDel声明为这样的extern:

extern delegate MyDel;

我收到错误:

  

错误C2146:语法错误:在标识符';'之前缺少'MyDel'

如果我试试这个

extern delegate void MyDel();

我收到错误:

  

错误C2144:语法错误:'void'前面应加';'

那么如何让其他类识别委托类型,以便将委托指针传递给构造函数?

1 个答案:

答案 0 :(得分:2)

delegate关键字用于定义委托类型,而不是声明恰好是某种委托类型的变量。即,一旦定义了委托类型,您在任何时候都不需要delegate关键字。

此外,C ++ / CLI中不允许使用托管类型的全局变量;通常的解决方法是使用逻辑静态托管类,其中公共静态数据成员充当全局变量:

delegate void MyDel();
private ref struct Globals abstract sealed
{
    static MyDel^ MyDelInstance;
};

// ...

Globals::MyDelInstance = gcnew MyDel(this, &CotStinger::Form1::testFunc);

  

那么如何让其他类识别委托类型,以便将委托指针传递给构造函数?

与任何其他类型相同 - 将其放在头文件中,两个类都可以#include