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

Fir*_*DoL 2 c# multithreading signals callback winforms

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

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

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

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

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

例:

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

这种回调从另外一个程序,我不拥有控制权叫,我想在主线程中运行OnConfigure方法(即处理我的WinForm的),怎么办呢?或者换句话说,我想运行OnConfigure而不需要考虑锁

编辑1:

我有这个例外的问题:

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

编辑2:

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

Ada*_*son 6

如果您使用的WinForms,你想在UI线程上执行的东西,你需要调用InvokeBeginInvoke一些控制(可能是一个Button或一个Form或其他)这是在该线程创建的.为了做到这一点,你需要一个引用它.

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

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