我将本机 C DLL 与 C# 互操作一起使用。我将委托作为函数指针传递给本地 DLL,当本地 DLL 想要通知我某些事件时,我的方法在 C# 中调用。然后我想更新我的表单上的文本框。这会导致在正常的仅 .NET 跨线程操作期间未遇到的意外问题。如何从 C DLL 的本机线程更新表单上的 TextBox?
我试过:
// Dumb approach
// causes Exception - Cross Thread Operation on GUI - expected
textBox1.Text = "some text";
// Invoke approach
// causes Exception (Cross Thread Operation on GUI)
textBox1.Invoke(new AddTextDelegate(AddText), new object[] { text });
// SynchronizationContext approach
// causes unhandled win32 exception with no call stack an no way to debug
context.Post(new SendOrPostCallback(delegate { eventHandler(this, args); }), null);
// My own .NET thead approach
// causes unhandled win32 exception with no call stack an no way to debug
Thread thread = new Thread(new ParameterizedThreadStart(LogMethod));
thread.Start(text);
如果涉及 .NET 线程,上述所有操作都可以正常工作,但如果涉及来自本机 DLL 的线程则失败。