轉(zhuǎn)帖|其它|編輯:郝浩|2011-01-11 14:22:16.000|閱讀 1344 次
概述:WPF開發(fā)工具是一款專門針對于圖形界面的工具。在這里我們將會針對WPF線程來幫助大家進一步理解WPF中的具體含義,提高自己的開發(fā)速率。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
WPF開發(fā)工具是一款專門針對于圖形界面的工具。在這里我們將會針對WPF線程來幫助大家進一步理解WPF中的具體含義,提高自己的開發(fā)速率。
跨線程調(diào)用控件
WPF應(yīng)用程序都至少有兩個WPF線程,一個用于UI繪制,其隱藏于后臺,另一個用于管理UI。WPF中UI元素只能由創(chuàng)建該元素的線程來訪問。Dispatcher類來負(fù)責(zé)線程的組織和維護。通用的解決方法是使用提供的Dispatcher.Invoke方法來調(diào)用一個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";
}
但是這樣的缺點是要Code
Application.Current.
Dispatcher.BeginInvoke
(DispatcherPriority.Normal,
(ThreadStart)delegate()
{ DataDispatch(); });
private void DataDispatch()
{
FireEvent();
}
不得不為每個調(diào)用編寫一個Invoke,還要額外聲明一個委托類型。為了減少代碼,可以采用匿名函數(shù)來寫。
Invoke(new (MethodInvoker)delegate { Text = "Hello"; });
或者
Invoke(new (Threadstart)delegate { Text = "Hello"; });
跨線程發(fā)布事件
當(dāng)主線程調(diào)用了輔助WPF線程中類的事件時,輔助線程可以將事件發(fā)布到主線程。可以采用ThreadStart委托。ThreadStart委托表示在Thread上執(zhí)行的方法,語法如下:
public delegate void
ThreadStart()
我們可以采用默認(rèn)的Threadstart委托在其他線程(如主線程)上執(zhí)行事件觸發(fā)的操作。如:
Application.Current.Dispatcher.
BeginInvoke(DispatcherPriority.
Normal, (ThreadStart)delegate()
{ DataDispatch(); });
private void DataDispatch()
{
FireEvent();
}
WPF線程說明:
對于Thread.ctor()來說,接受的是一個ThreadStart委托,編譯器便可以將匿名函數(shù)與ThreadStart委托類型匹配,最后能夠正確編譯。
對于Control.Invoke()來說,任何的代理類型都是可以接受,也就是說ThreadStart和MethodInvoker都是可以接受的類型。所以就需要顯示指定委托的類型,否則編譯器無法直到匹配的匿名函數(shù),導(dǎo)致了編譯錯誤的發(fā)生。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載