如何使用Control-> Invoke()?

时间:2011-12-01 16:47:55

标签: .net winforms delegates c++-cli

我不确定使用.NET,C ++和Windows窗体正确使用Control-> Invoke()。

例如,使用这样的方法:

System::Void UI::setStatusText(System::String^ text) {
    if (this->InvokeRequired) {
        SetTextDelegate^ d = gcnew SetTextDelegate(this, &UI::setStatusText);
        statusLabel->Invoke(d, gcnew array<Object^> { text }); // <-- System.ExecutionEngineException
    } else
        statusLabel->Text = text;
}

这是正确的吗?此方法由任意线程执行,并应更改statusLabel的文本。

委托声明为:

delegate void SetTextDelegate(System::String^ text);

但是我经常在标记的行中得到System.ExecutionEngineException。

这段代码出了什么问题?

谢谢, 马丁

edit:visual studio表示mscorlib.dll中存在类型System.ExecutionEngineException的非托管异常,绿色调试箭头指向标记的行。这是堆栈跟踪:http://sharetext.org/B8RR。但是我如何获得内部异常呢?或者,如果这不是由这些代码行引起的,我还能做些什么来找出错误?

1 个答案:

答案 0 :(得分:0)

委托代码似乎是正确的。但我不明白你在做什么。您正在创建一个创建相同函数setStatusText的委托!我想你正试图做这样的事情:

delegate void SetTextDelegate();

System::Void UI::setStatusText(System::String^ text)
{
  statusLabel->Text = text
}

System::Void UI::ANOTHER_FUNCTION(System::String^ text)
{   
   SetTextDelegate^ d = gcnew SetTextDelegate(this, &UI::setStatusText);
   statusLabel->Invoke(d, gcnew array<Object^> { text });
}