使用委托从后台任务更新 UI

updating UI from background task using delegate

本文关键字:后台任务 更新 UI      更新时间:2023-10-16

我正在尝试从后台线程更新标签值。我知道有几个例子,但我仍然无法理解为什么下面的代码会引发堆栈溢出错误。似乎每次执行 setTitle() 时,它都会经过 if 语句的真实部分。

设置标题功能:

    void setTitle(char data[])
    {
        String^ temp = gcnew String(data);
        if(this->lastSeen1->InvokeRequired)
        {
            setTitleDelegate^ d = gcnew setTitleDelegate(this, &setTitle);
            d->Invoke(data);
        }else
        {
            this->lastSeen1->Text = temp;
            this->lastSeen1->Visible = true;
        }
    }

委托:

delegate void setTitleDelegate(char data[]);

谢谢

好吧,因为这个:

d->Invoke(data);

看,这里你叫Delegate::Invoke,这基本上意味着setTitle会立即调用自己。您需要改为调用Control::Invoke,因此您需要在Control的实例上调用它,如下所示:

this->lastSeen1->Invoke(d, /* any args here */);

我不知道你为什么要在这里传递一个char[],最好不要过多地混合本机和托管数据结构,如果你可以使用String^来代替(但即便如此,C++/CLI 也不是真正用于 UI 开发......