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线程的完成而直接执行自己下面的代码。

浙公网安备 33010602011771号