C#:如何通过以某种方式从另一个线程发出信号来强制从主线程“调用”一个方法

对不起长标题,我甚至不知道如何表达问题的方式

我正在使用一个库,它从主线程(是一个C库)的不同上下文运行回调,我在C#中创建了回调,当我被调用时,我想提出一个事件。

但是因为我不知道事件内部会是什么,我想找到一种方法来调用方法而不会出现锁等问题(否则第三方用户将不得不在事件中处理这个问题,非常难看)

有没有办法做到这一点? 我可以完全错误的方式,但我正在考虑winforms方式来处理不同的线程(.Invoke的事情)

否则我可以发送消息到窗口的消息循环,但我不知道很多关于消息传递,如果我可以发送像这样的“自定义”消息

例:

private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext) { OnConfigure(EventArgs.Empty); return 0U; } 

这个回调是从另一个我无法控制的程序调用的,我想在主线程中运行OnConfigure方法(处理我的winform的那个),怎么做呢? 换句话说,我想运行OnConfigure而不需要考虑锁

编辑1:

我有这个例外的问题:

CallbackOnCollectedDelegate reived消息:在GarbageCollector中收集的委托’G19dotNet!G19dotNet.LgLcd + lgLcdOnSoftButtonsCB :: Invoke’上运行回调。 在非托管代码期间,应确保代理永远不会被删除,直到您确定它们永远不会被调用

编辑2:

问题由我自己解决,感谢Stackoverflow总是帮助我! 供将来参考: 将委托定义为函数指针

如果您正在使用WinForms并且想要在UI线程上执行某些操作,则需要在该线程上创建的某些控件(无论是Button还是Form或其他)上InvokeBeginInvoke 。 为了做到这一点,你需要一个引用它。

例如,使用您的代码并假设您有一个名为form的表单的引用:

 private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext) { form.Invoke(new MethodInvoker(() => OnConfigure(EventArgs.Empty))); return 0U; } 

在调用第三方函数之前,请获取对Dispatcher.CurrentDispatcher的引用。 在回调函数中,使用dispatcher.Invoke。

你最终得到的将是这样的:

 class MyClass { private Dispatcher dispatcher; public void runThirdParty() { this.dispatcher = Dispatcher.CurrentDispatcher; callThirdPartyFunction(myCallBack); } public void myCallBack() { this.dispatcher.Invoke(new Action(() => { //code to run here. })); } } 

这种称为基于事件的异步模式有一种模式 。 链接的文章是关于如何使用它的一个很好的概述。 AsyncOperation类是此模式的关键。

此模式可能与您尝试解决的问题不完全吻合,但它可能会为您提供有关问题的一些见解。