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
或其他)上Invoke
或BeginInvoke
。 为了做到这一点,你需要一个引用它。
例如,使用您的代码并假设您有一个名为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类是此模式的关键。
此模式可能与您尝试解决的问题不完全吻合,但它可能会为您提供有关问题的一些见解。
上述就是C#学习教程:C#:如何通过以某种方式从另一个线程发出信号来强制从主线程“调用”一个方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1022047.html