簡體   English   中英

在C#應用程序中的任務之間共享集合

[英]Share collections between tasks within c# application

我有一個wpf應用程序,其中必須填寫一些Collection:

 private async Task  FillList()
        {

             await Task.Factory.StartNew(() =>
                                           {
                gdpList = SimpleIoc.Default.GetInstance<ICrud<gdp_groupe>>().GetAll().ToList();
                MedecinGDP.AddRange(SimpleIoc.Default.GetInstance<ICrud<vue_medecin>>().GetAll());
                CodeGDP_Collection.AddRange(gdpList);
                FiltredParticipant.AddRange(SimpleIoc.Default.GetInstance<ICrud<fsign_fiche>>().GetAll());
            });
        }

問題是我調用此方法后集合仍然為空。 當我更改這種方法(同步方式)時:

private void  FillList()
            { 
                    gdpList = SimpleIoc.Default.GetInstance<ICrud<gdp_groupe>>().GetAll().ToList();
                    MedecinGDP.AddRange(SimpleIoc.Default.GetInstance<ICrud<vue_medecin>>().GetAll());
                    CodeGDP_Collection.AddRange(gdpList);
                    FiltredParticipant.AddRange(SimpleIoc.Default.GetInstance<ICrud<fsign_fiche>>().GetAll());

            }

收藏變得充滿! 所以我需要知道:

如何在不同任務之間共享收藏集?

除了建議鎖定之外,我建議使用線程安全的集合。 現在,當多個線程/任務同時調用Add方法時,該集合可能變得無效。 對我來說,使用線程安全的集合比使用lock更容易。 另外,當您的集合被多個類使用時, lock很難使用。

正如Dave Black在評論中指出的那樣,線程安全集合使用無鎖同步,這必須比獲取鎖更快,這可以從MSDN上閱讀。

您可以使用的集合之一是ConcurrentBag<T> ,可以將其與List<T>進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM