Multithreading 返回从另一个线程调用委托的结果

Multithreading 返回从另一个线程调用委托的结果,multithreading,delegates,c++-cli,invoke,Multithreading,Delegates,C++ Cli,Invoke,我有一个带有TabControl的GUI。每个新选项卡页都是通过一个新线程创建的。我想调用this->tabControl->TabCount,但是tabControl属于我调用的线程以外的线程。因此,我需要调用一个委托。然而,我在网上找到的所有示例都显示了从每个委托方法打印到std::cout。我需要一个返回值,在本例中为int delegate int MyDel(); int InvokeTabCount() { if (this->InvokeRequired) {

我有一个带有TabControl的GUI。每个新选项卡页都是通过一个新线程创建的。我想调用
this->tabControl->TabCount
,但是
tabControl
属于我调用的线程以外的线程。因此,我需要调用一个委托。然而,我在网上找到的所有示例都显示了从每个委托方法打印到
std::cout
。我需要一个返回值,在本例中为
int

delegate int MyDel();
int InvokeTabCount()
{
    if (this->InvokeRequired)
    {
        MyDel^ del = gcnew MyDel(this, &MyTabControl::InvokeTabCount);
        auto temp = this->Invoke(del); // can't just "return this->Invoke(del)"
        return temp; // Invoke() returns a System::Object^
    }
    else
    {
        return this->tabControl->TabCount;
    }
}

void CreateNewTab()
{
    // do stuff
    this->tabControl->TabPages->Insert(InvokeTabCount() - 1, myNewTab); // insert a tab
    this->tabControl->SelectTab(InvokeTabCount() - 2); // OutOfBounds and tabPageNew
}

System::Void MethodToAddNewTabPage() //actually a click event but whatever
{
    System::Threading::Thread^ newThread = 
        gcnew System::Threading::Thread(
            gcnew System::Threading::ThreadStart(this, &MyTabControl::CreateNewTab));
    newThread->Start();
}
当前,我的
InvokeTabCount()
方法正在返回
-1
,而我只是
this->Invoke(del)
而不返回它。我无法
返回它,因为我的方法希望返回
int
,而不是
System::Object^
,后者是
Invoke()
返回的。但是,在调试时,我发现
auto temp
包含正确的值
2
。并且
temp->ToString()
包含值
“2”
,该值也是正确的

如何
返回此->调用(del)


是否需要在
InvokeTabCount()
方法中设置全局变量的值?我想我可以找到一种方法,将
System::String^
转换为
std::String
,以利用
std::stoi()
,但这似乎是一种奇怪的解决方法


当前解决方案:

delegate int MyDel();
int InvokeTabCount()
{
    if (this->InvokeRequired)
    {
        MyDel^ del = gcnew MyDel(this, &MyTabControl::InvokeTabCount);
        auto temp = this->Invoke(del);
        return int::Parse(temp->ToString());
    }
    else
    {
        return this->tabControl->TabCount;
    }
}

结果是一个整数,已装箱并包含在
对象^
引用中。您应该能够简单地将其强制转换为
int

如果您想更加安全,请执行空检查并验证
temp->GetType()
是否返回
int::typeid
,但这可能有些过分,因为您正在那里创建委托(仍然是键入的形式)