在我的C#Silverlight應用程序中初始化UI時,我對不同的服務進行了幾次異步調用。儘管異步執行所有加載的過程非常快捷,但仍然有時候需要加載的一些步驟發生在最後。跟蹤異步加載與線程安全嗎?
在過去的一些看法中,我實現了一個「加載列表」機制來幫助我跟蹤加載情況,並確保在他們觸發時任何操作的挑剔順序。這裏是一個非常簡化的例子:
private List<string> _loadingList = new List<string>();
// Called to begin the loading process
public void LoadData(List<long> IDs){
foreach(long id in IDs){
DoSomethingToLoadTheID(id);
_loadingList.Add(id.ToString());
}
}
// Called every time an ID finishes loading
public void LoadTheIDCompleted(object sender, ServiceArgs e){
UseTheLoadedData(e);
_loadingList.Remove(id.ToString());
if(_loadingList.Count == 0)
LoadDataFinally();
}
// Must be called after all other loading is completed
public void LoadDataFinally(){
ImportantFinishingTouches();
}
這個東西適用於我的目的,我還沒有遇到任何問題。但我沒有信心我的線程安全的知識,我想是的,所以我想問幾個問題:
- 有什麼辦法這種事情可以搞砸災難性的?
- 有沒有更好的方法來完成相同的功能?
(我使用Visual Studio 2013和.NET Framework 4.5.51209,和Silverlight 5.0)
是的,我沒有把實際的線程東西放在我的例子中,因爲它非常笨重。該項目使用WCF服務,但不幸的是,我不知道除了通過調用生成的* ServiceName * Async()方法啓動它們以外,這些工作是如何實現的,並且您通過訂閱生成的* ServiceName *來獲得結果。Completed事件。儘管我希望使用TPL,但我不確定它將如何適應這種模式,這在所有應用程序中都是如此。 –
我還有一個印象,Silverlight無法訪問System.Collections.Concurrent命名空間中的任何內容,並且據我所知,從谷歌搜索中可以看出,並不存在ConcurrentList之類的東西。 –
http://stackoverflow.com/questions/18396139/which-version-of-silverlight-supports-task-parallel-library – DVK