Windows Phone / Store 8.1应用程序中的SynchronizedCollection <t> </t>

时间:2015-02-19 13:11:10

标签: c# .net windows-store-apps windows-phone-8.1

我刚刚开始开发Windows Phone 8.1 / Windows Store 8.1通用应用程序。我想使用.NET框架中的SynchronizedCollection<T>类(4.5.1)。但显然Visual Studio 2013在我的Windows Phone 8.1和Windows Store 8.1应用程序项目中都找不到System.Collections.Generic.SynchronizedCollection下的类。

根据我的项目&#39;设置,都引用了相应平台的.NET 4.5.1框架。

他们是否可以在这些应用中使用SynchronizedCollection<T>?如果没有,是否有其他类可以用作替代(包括用于同步处理的锁)?

1 个答案:

答案 0 :(得分:2)

新的System.Collections.Concurrent(在.net framework 4中添加)命名空间可用于Windows Phone / Store 8.1应用程序。

请查看此处的文档:

Thread-Safe Collections

根据你的评论,我很想写自己的评论。如果您的集合不包含大量的侦听器,您可以使用以下内容:

public class ThreadSafeList<T> : IEnumerable<T>
{
    private List<T> _listInternal = new List<T>();
    private object _lockObj = new object();

    public void Add(T newItem)
    {
        lock(_lockObj)
        {
            _listInternal.Add(newItem);
        }
    }

    public bool Remove(T itemToRemove)
    {
        lock (_lockObj)
        {
            return _listInternal.Remove(itemToRemove);
        }
    }


    public IEnumerator<T> GetEnumerator()
    {
        return getCopy().GetEnumerator();                  
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return getCopy().GetEnumerator();
    }

    private List<T> getCopy()
    {
        List<T> copy = new List<T>();
        lock (_lockObj)
        {
            foreach (T item in _listInternal)
                copy.Add(item);
        }
        return copy;
    }
}

因为IEnumerable<T>的实现创建了集合的副本,所以您可以使用foreach循环迭代列表并对其进行修改,如下所示:

 ThreadSafeList<String> myStrings = new ThreadSafeList<String>();

 for (int i = 0; i < 10; i++)     
      myStrings.Add(String.Format("String{0}", i));

 foreach (String s in myStrings)
 {
      if (s == "String5")
      {
           // As we are iterating a copy here, there is no guarantee
           // that String5 hasn't been removed by another thread, but 
           // we can still try without causing an exception
           myStrings.Remove(s);
      }
 }

这绝不是完美的,但希望它可以帮到你。