WPF创建UI线程(C#)

Winform或者WPF中创建UI线程,不像MFC中有CWinThread。C#中创建线程就直接一个Thread。其实说到底还是工作线程与UI线程的区别。可以简单的这么说,若线程能够处理窗口资源,则为UI线程,否则为工作线程。所谓处理窗口资源,说到底就是处理窗口的消息队列。MFC中的线程有个消息循环:

MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }

同理,C#的UI线程也应该有一个消息循环。应用在创建的时候,主线程会默认创建一个消息队列用以处理控件消息。但普通的工作线程创建,则不具备消息队列。C#的线程创建如下:

Thread m=new Thread(new ThreadStart(threadfunc));
m.Start();

void threadfunc()
{
}

假设我们在threadfunc中创建一个窗口:

void threadfunc() { Window a=new Window(); a.Dispacher.Invoke(DispatcherPriority.Normal, (Action)delegate() { a.Show(); }); }

a可以显示,但之后要更新窗口的状态,就不行了。这是因为线程没有消息队列。如何为创建的线程添加消息队列呢?.net架构提供了接口System.Windows.Threading.Dispatcher.Run();

void threadfunc()
{
Window a=new Window();
a.Dispacher.Invoke(DispatcherPriority.Normal, (Action)delegate() { a.Show(); });
System.Windows.Threading.Dispatcher.Run();
}
若你在Run()后面多添加一个语句,打上断点,你就会发现,执行到Run()之后,就不再执行下一句了。那么我们可以合理猜测,Run()里创建了消息循环。同时,我们可以发现,之后窗口就能够处理控件的状态更新了。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值