繁体   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