C#: How to force “calling” a method from the main thread by signaling in some way from another thread

前端 未结 3 592
情深已故
情深已故 2020-12-21 16:26

Sorry for long title, I don\'t know even the way on how to express the question

I\'m using a library which run a callback from a different context from the main thre

相关标签:
3条回答
  • 2020-12-21 16:46

    If you're using WinForms and you want to execute something on the UI thread, you need to call either Invoke or BeginInvoke on some control (be it a Button or a Form or whatever) that was created on that thread. You'll need a reference to it in order to do this.

    For example, with your code and assuming that you have a reference to a form called form:

    private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext)
    {
        form.Invoke(new MethodInvoker(() => OnConfigure(EventArgs.Empty)));
        return 0U;
    }
    
    0 讨论(0)
  • 2020-12-21 17:01

    Before you call the 3rd party function, get a reference to Dispatcher.CurrentDispatcher. In the callback function, use dispatcher.Invoke.

    What you end up with will look something like this:

    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.
            }));
        }
     }
    
    0 讨论(0)
  • 2020-12-21 17:03

    There is a pattern for this called Event-based Asynchronous Pattern. The article linked is a great overview on how to use it. The AsyncOperation class is the key to this pattern.

    This pattern might not fit perfectly with your problem that you are trying to solve, but it might give you some insights into the problem.

    0 讨论(0)
提交回复
热议问题