0

我将本机 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 的线程则失败。

4

1 回答 1

1

你可以看看这个链接:

http://www.codeproject.com/Articles/16726/Cross-thread-calls-in-native-C

这听起来像你正在寻找的东西。我没有仔细阅读,因为它有点长。您也可以使用锁定队列来放入请求。然后你可以在你的代码端有一个计时器,它检查队列中是否有新的项目来操作。如果我有很多来自其他线程的数据,我有时会这样做。调用也需要一些时间。最好不要在 gui 线程中进行所有计算,而只在 GUI 线程中进行 GUI 更新。但我想你已经知道这些方面了。

于 2013-03-13T09:00:35.460 回答