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