人如果没有梦想那和咸鱼有什么区别,即使是做咸鱼也要做最咸的那一条

—— Wy

C#如何回到主线程,如何在委托指定线程执行

SynchronizationContext.Current 为获取当前线程的同步上下文,通过调用Send(同步)和Post (异步)将消息分派到同步上下文,以此实现在指定线程执行!!!


this.Invoke为当拥有此控件的基础窗口句柄的线程上执行指定的委托。通过传递此委托,可以在类库里面调用,以此达到在多线程情况下,依然可以随时在主线程里执行委托


SynchronizationContext mainThreadSynContext = SynchronizationContext.Current;
            Action action = null;
            Console.WriteLine($"主线程ID:{Thread.CurrentThread.ManagedThreadId}");
            action += () =>
            {
                Console.WriteLine($"委托线程ID:{Thread.CurrentThread.ManagedThreadId}");
            };
            Task.Run(() =>
            {
                Console.WriteLine($"Task线程ID:{Thread.CurrentThread.ManagedThreadId}");
                action?.Invoke();
                mainThreadSynContext.Send(new SendOrPostCallback((ss) =>
                {
                    Console.WriteLine($"听说是主线程ID:{Thread.CurrentThread.ManagedThreadId}");
                }), null);//通知主线程
                s(this.Invoke);
            });

            void s(Func<Delegate, object> _action)
            {
                _action.Invoke(new Action(() =>
                {
                    Console.WriteLine($"窗体控件线程ID:{Thread.CurrentThread.ManagedThreadId}");
                }));
            }


执行结果如下




评论

用户默认头像
发表我的评论
取消评论
看不清,点击刷新验证码
  1. 用户默认头像
    收藏了
    十三 2019年11月28日 20:25:03 回复