来自C ++ / CLI库的回调委托导致C#代码中的InvalidOperationException - 如何调用?

时间:2013-11-14 17:51:29

标签: c# thread-safety c++-cli invoke

我已经用C ++ / CLI编写了一个库,以便更容易地从托管代码访问MIDI功能。该库有一个托管类,它包含一个类,该类提供委托作为事件处理程序,并由midiInOpen函数的“本机”Callback方法调用。

void MidiInDevice::MidiInProcNative(HMIDIIN midiInDevice, UINT msg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
    if(MidiInProcedure == nullptr)
        return;

    MidiMessage^ message;
    switch(msg)
    {
    case MIM_DATA:
        {
            message = gcnew MidiMessage(dwParam1, dwParam2);
            break;
        }
    }

    MidiInProcedure(this, message);
}

现在我已将此方法添加到委托,该委托是加载c ++ / cli库的C#应用​​程序的一部分:

    public void MidiInProc(SharpMidi.MidiInDevice midiInDevice, SharpMidi.MidiMessage message)
    {
        tbMidiInMessages.AppendText(String.Format("\n{0}: {1:X}", message.TimestampString, message.Message));

    }

但是我在AppendText电话上收到InvalidOperationException(跨线程操作无效)。

当谷歌搜索问题时,我被淹没了异常的明显的窗体形式案例,由于我的MidiMessage类没有提供任何调用功能,因此不知何故这对我没有帮助。

那么我有什么方法可以解决这个问题呢?

此致 Xaser

1 个答案:

答案 0 :(得分:1)

您的问题与Windows窗体完全相关。使用Invoke对象(System.Windows.Forms.Textbox)的tbMidiInMessage方法,或拥有它的System.Windows.Forms.Form(C#用户界面代码中的this对象)。< / p>

相关问题