我用 C++/CLI 编写了一个库,以便更轻松地从托管代码访问 MIDI 功能。库有一个托管类,其中包含一个提供委托作为事件处理程序的类,并由 midiInOpen 函数的“本机”回调方法调用。
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));
}
但是,我在调用时收到 InvalidOperationException (Cross-Thread Operation Invalid) AppendText
。
在谷歌搜索这个问题时,我被明显的 Windows 窗体异常情况淹没了,这在某种程度上并没有真正帮助我,因为我的 MidiMessage 类不提供任何调用功能。
那么我有什么选择来解决这个问题呢?
问候, 赛瑟