原創(chuàng)|其它|編輯:郝浩|2012-08-26 21:53:53.000|閱讀 734 次
概述:這是WPF 4.5的新特性介紹的第七部分。集合是每個應(yīng)用程序的一部分,他們的管理可能是你在理解WPF時首先要學(xué)會的。最初當(dāng)你把一切都放在主(UI)線程上,你會覺得它工作地很好。但是之后你會意識到,這凍結(jié)了應(yīng)用程序的UI,用戶通常不會喜歡這種方式。然而你想把集合放在另外的線程上,從而解放UI線程的話又是不可能的,因為:“這種類型的CollectionView不支持改變其SourceCollection的線程變換”。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
這是WPF 4.5的新特性介紹的第七部分。集合是每個應(yīng)用程序的一部分,他們的管理可能是你在理解WPF時首先要學(xué)會的。更多WPF4.5探秘系列文章 WPF控件
最初當(dāng)你把一切都放在主(UI)線程上,你會覺得它工作地很好。但是之后你會意識到,這凍結(jié)了應(yīng)用程序的UI,用戶通常不會喜歡這種方式。然而你想把集合放在另外的線程上,從而解放UI線程的話又是不可能的,因為:“這種類型的CollectionView不支持改變其SourceCollection的線程變換”。
在本文里我們將探討這一問題。
一 、在WPF4.0中我們是怎樣處理的呢?
假如你有一個帶有顯示列表的應(yīng)用程序,那么在加載完整名單的時候就需要很長的時間,因為它需要程序通過WCF服務(wù)進入數(shù)據(jù)庫,然后才能返回信息。
在WPF4.0中由兩種解決方法:
1、在UI線程上檢索數(shù)據(jù)和每次添加UI線程更新。這種方法并不可取,因為這是一種黑客行為,而且反應(yīng)接口會變得很奇怪。
2、在其它線程上檢索數(shù)據(jù),將信息傳遞到UI線程上并創(chuàng)建列表。這是大多數(shù)人會選擇的方法,但是由于編寫起來很復(fù)雜所以會降低代碼的可讀性。
下面是第二種方法的一個例子:
private void LoadUpPersonsClick(object sender, RoutedEventArgs e)
{
Task.Factory
//Retrieve the persons on another thread.
.StartNew>(RetrieveTheCollection)
.ContinueWith(t =>
{
foreach (var p in t.Result) _persons.Add(p);
},
//Continue on the UI Thread
TaskScheduler.FromCurrentSynchronizationContext());
}
public List RetrieveTheCollection()
{
List persons = new List();
for (int i = 0; i < 10; i++)
{
persons.Add(new Person() { Name = "Person " + i, Age = 40 + i % 5 });
}
return persons;
}
二、在WPF4.5中是怎樣處理的呢?
在WPF4.5中處理方法將會變得很容易:只需要通過EnableCollectionSynchronization方法就能進行處理。這是一種BindingOperations類的靜態(tài)方法。
它接受兩個參數(shù):跨多個線程訪問的集合將被用作一個鎖定的對象。如下段代碼:
//Creates the lock object somewhere
private static object _lock = new object();
...
//Enable the cross acces to this collection elsewhere
BindingOperations.EnableCollectionSynchronization(_persons, _lock);
另外有一個過載采用CollectionSynchronizationCallback回調(diào)和可作為null的附加參數(shù)。可以設(shè)定使用的同步機制,用以替代默認(rèn)鎖定。
可以想象,所有的同步工作都將是在由你自己決定的框架下工作,你最終寫成的代碼將會類似于下面的片段:
private void AccessTheCollectionFromANonUIThreadClick(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(EditTheCollection);
}
public void EditTheCollection()
{
for (int i = 0; i < 10; i++)
{
_persons.Add(new Person() { Name = "Person " + i, Age = 20 + i % 5 });
}
}
顯然看起來可讀性更強,更容易理解,編寫也更容易。
和以前一樣,一個完整的項目在注冊后同樣可以放在Dropbox文件夾中。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)資源編譯