C# 子线程 与 主线程通信

方式一、使用委托(delegate)

方式二、使用同步上下文(SynchronizationContext)

/// <summary>
/// CallbackThread.xaml 的交互逻辑
/// </summary>
public partial class CallbackThread : Window
{
    private System.Threading.SynchronizationContext mainThreadSynContext;
    public CallbackThread()
    {
        InitializeComponent();
        //方式一:使用委托
        ChildThread child = new ChildThread();
        child.callback = ThreadCallBack;
        new System.Threading.Thread(new System.Threading.ThreadStart(child.ThreadStart)).Start();

        //方式二:使用同步上下文
        mainThreadSynContext = System.Threading.SynchronizationContext.Current;
        new System.Threading.Thread(new System.Threading.ThreadStart(ThreadStart)).Start();
    }
    //主线程执行
    private void OnConnected(object obj)
    {
        //这里是主线程执行代码
    }

    //主线程执行
    private void ThreadCallBack(string msg)
    {
        //这里是主线程执行代码
    }

    //多线程执行
    private void ThreadStart()
    {
        object obj = new { id = 1 };
        //通知主线程,同步调用,等UI线程执行完成后子线程才继续执行
        mainThreadSynContext.Send(new System.Threading.SendOrPostCallback(OnConnected), obj);
        //通知主线程,异步调用,不等UI线程执行完成后子线程才继续执行
        mainThreadSynContext.Post(new System.Threading.SendOrPostCallback(OnConnected), obj);
    }
}

public class ChildThread
{
    //创建委托
    public delegate void ThreadCallBackDelegate(string msg);
    //委托声明
    public ThreadCallBackDelegate callback;
    //多线程执行
    public void ThreadStart()
    {
        //调用主线程并传递参数
        callback("http://microsoft-zh.cn");
    }
}

注意:SynchronizationContext的对象不是所有线程都被附加的,只有UI主线程会被附加。

SynchronizationContext的Sendt()和Post()二个方法的区别:

Send() 是简单的在当前线程上去调用委托来实现(同步调用)。也就是在子线程上直接调用UI线程执行,等UI线程执行完成后子线程才继续执行。

Post() 是在线程池上去调用委托来实现(异步调用)。这是子线程会从线程池中找一个线程去调UI线程,子线程不等待UI线程的完成而直接执行自己下面的代码。

posted @ 2021-03-29 14:00  microsoft-zhcn  阅读(1330)  评论(0)    收藏  举报