2014-04-28 12 views
6

Tôi có một ứng dụng có danh sách các đối tượng được lưu trữ trong một concurrentbag tĩnh.ConcurrentBag Alternative Trong thư viện lớp di động

Giao diện người dùng có bộ hẹn giờ chạy các phương thức có thể cập nhật các đối tượng trong ConcurrentBag.

Chỉ một chủ đề (Bắt đầu bởi bộ hẹn giờ) sẽ cố gắng cập nhật các đối tượng này. Tuy nhiên chủ đề này sẽ liệt kê thông qua danh sách và sau đó cập nhật các mục khi nó đi.

Đồng thời các chủ đề này có thể được đọc bởi chuỗi giao diện người dùng.

ConcurrentBag đang hoạt động hoàn hảo cho những gì tôi muốn làm. Tất cả các logic kinh doanh là trong một dự án riêng biệt và bây giờ tôi cần phải cổng tất cả mọi thứ cho IOS và Android. Tôi đang làm điều này với Xamarin và vì vậy chuyển đổi logic kinh doanh thành một thư viện lớp di động.

Mặc dù mọi thứ tôi nhắm mục tiêu xuất hiện để hỗ trợ ConcurrentBag, khi tôi cố gắng truy cập nó trong PCL, System.Collections.Concurrent không khả dụng. Ngay cả khi tôi chỉ nhắm mục tiêu các ứng dụng cửa sổ 4.5 trở lên. Cả hai ứng dụng này đều sử dụng ConcurrentBags cho)

+0

Phiên bản VS nào bạn đang sử dụng, và bạn chọn mục tiêu PCL nào? Nếu tôi ví dụ chọn * .NET 4 *, * Windows (ứng dụng Store) 8 *, * Xamarin.Android * và * Xamarin.iOS * trong bản cập nhật VS2013 2RC, tôi có thể sử dụng thành công 'ConcurrentBag' trong mã của mình. Miễn là bạn không nhắm mục tiêu * Windows Phone * hoặc * Silverlight *, tôi nghĩ bạn sẽ không gặp vấn đề gì khi sử dụng 'ConcurrentBag' trong PCL của bạn. –

+0

Cảm ơn Anders. Tôi hiện đang cập nhật 1 nên tôi đang tải xuống bản cập nhật 2 ngay bây giờ để xem liệu nó có giúp ích hay không. Có phải tất cả các phiên bản của Win Phone không hoạt động? – Oli

+0

Tôi vừa kiểm tra; Không gian tên 'System.Collections.Concurrent' là * not * được bao gồm trong bất kỳ phiên bản WP nào, bao gồm cả 8.1. Nhân tiện, có vẻ như bạn không thể truy cập 'ConcurrentBag' trên Bản cập nhật VS 2013 1 miễn là bạn tránh các mục tiêu WP/Silverlight? Bạn đã kiểm tra lại rằng nó không hoạt động trên Update 1 ngay cả khi bạn nhắm mục tiêu .NET 4, Windows (Store) 8, Xamarin.Android và Xamarin.iOS? –

Trả lời

1

Vâng, nếu hiển nhiên sẽ không hoạt động, bạn có một số tùy chọn ở đây. Đầu tiên, là để dịch ngược ConcurrentBag và sử dụng mã đó. Thứ hai, là đến với một sự thay thế. Đó là ước tính của tôi rằng bạn trong trường hợp cụ thể của bạn không nhất thiết cần đảm bảo hiệu suất và các vấn đề đặt hàng của ConcurrentBag ... Vì vậy, đây là ví dụ hoạt động phù hợp với hóa đơn của bạn:

namespace Naive 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Collections.ObjectModel; 

    public class ThreadSafeCollectionNaive<T> 
    { 
     private readonly List<T> _list = new List<T>(); 
     private readonly object _criticalSection = new object(); 

     /// <summary> 
     /// This is consumed in the UI. This is O(N) 
     /// </summary> 
     public ReadOnlyCollection<T> GetContentsCopy() 
     { 
      lock (_criticalSection) 
      { 
       return new List<T>(_list).AsReadOnly(); 
      } 
     } 

     /// <summary> 
     /// This is a hacky way to handle updates, don't want to write lots of code 
     /// </summary> 
     public void Update(Action<List<T>> workToDoInTheList) 
     { 
      if (workToDoInTheList == null) throw new ArgumentNullException("workToDoInTheList"); 

      lock (_criticalSection) 
      { 
       workToDoInTheList.Invoke(_list); 
      } 
     } 

     public int Count 
     { 
      get 
      { 
       lock (_criticalSection) 
       { 
        return _list.Count; 
       } 
      } 
     } 

     // Add more members as you see fit 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var collectionNaive = new ThreadSafeCollectionNaive<string>(); 

      collectionNaive.Update((l) => l.AddRange(new []{"1", "2", "3"})); 

      collectionNaive.Update((l) => 
             { 
              for (int i = 0; i < l.Count; i++) 
              { 
               if (l[i] == "1") 
               { 
                l[i] = "15"; 
               } 
              } 
             }); 
     } 
    } 
} 
Các vấn đề liên quan