新聞中心
WPF開(kāi)發(fā)工具是一款專(zhuān)門(mén)針對(duì)于圖形界面的工具。在這里我們將會(huì)針對(duì)WPF線程來(lái)幫助大家進(jìn)一步理解WPF中的具體含義,提高自己的開(kāi)發(fā)速率。#t#

10年積累的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有新縣免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
跨線程調(diào)用控件
WPF應(yīng)用程序都至少有兩個(gè)WPF線程,一個(gè)用于UI繪制,其隱藏于后臺(tái),另一個(gè)用于管理UI。WPF中UI元素只能由創(chuàng)建該元素的線程來(lái)訪問(wèn)。Dispatcher類(lèi)來(lái)負(fù)責(zé)線程的組織和維護(hù)。通用的解決方法是使用提供的Dispatcher.Invoke方法來(lái)調(diào)用一個(gè)Delegate,從而安全地跨線程調(diào)用。(在winform中,是Control.Invoke)。
如下:
- public delegate void threadcall();
- public void Thread()
- {
- if (Dispatcher.Thread !=
Thread.CurrentThread)- {
- Dispatcher.Invoke(System.
Windows.Threading.Dispatcher
Priority.Normal,new threadcall
(CallMainThread)));- }
- else
- {
- CallMainThread();
- }
- }
- void CallMainThread()
- {
- textblock.text = "hello";
- }
但是這樣的缺點(diǎn)是要Code
- Application.Current.
Dispatcher.BeginInvoke
(DispatcherPriority.Normal,
(ThreadStart)delegate()
{ DataDispatch(); });- private void DataDispatch()
- {
- FireEvent();
- }
- 9
不得不為每個(gè)調(diào)用編寫(xiě)一個(gè)Invoke,還要額外聲明一個(gè)委托類(lèi)型。為了減少代碼,可以采用匿名函數(shù)來(lái)寫(xiě)。
- Invoke(new (MethodInvoker)
- delegate { Text = "Hello"; });
或者
- Invoke(new (Threadstart)
- delegate { Text = "Hello"; });
跨線程發(fā)布事件
當(dāng)主線程調(diào)用了輔助WPF線程中類(lèi)的事件時(shí),輔助線程可以將事件發(fā)布到主線程??梢圆捎肨hreadStart委托。ThreadStart委托表示在Thread上執(zhí)行的方法,語(yǔ)法如下:
- public delegate void
ThreadStart()
我們可以采用默認(rèn)的Threadstart委托在其他線程(如主線程)上執(zhí)行事件觸發(fā)的操作。如:
- Application.Current.Dispatcher.
BeginInvoke(DispatcherPriority.
Normal, (ThreadStart)delegate()
{ DataDispatch(); });- private void DataDispatch()
- {
- FireEvent();
- }
WPF線程說(shuō)明:
對(duì)于Thread.ctor()來(lái)說(shuō),接受的是一個(gè)ThreadStart委托,編譯器便可以將匿名函數(shù)與ThreadStart委托類(lèi)型匹配,最后能夠正確編譯。
對(duì)于Control.Invoke()來(lái)說(shuō),任何的代理類(lèi)型都是可以接受,也就是說(shuō)ThreadStart和MethodInvoker都是可以接受的類(lèi)型。所以就需要顯示指定委托的類(lèi)型,否則編譯器無(wú)法直到匹配的匿名函數(shù),導(dǎo)致了編譯錯(cuò)誤的發(fā)生。
網(wǎng)頁(yè)標(biāo)題:WPF線程調(diào)用控件與發(fā)布事件
標(biāo)題來(lái)源:http://m.fisionsoft.com.cn/article/djjgjdc.html


咨詢(xún)
建站咨詢(xún)
