2010-05-08 25 views
5

Cố gắng làm theo các hints laid out here, nhưng cô không đề cập đến làm thế nào để xử lý nó khi bộ sưu tập của bạn cần phải trả về một giá trị, như vậy:Trả lại các đối tượng từ một chuỗi khác?

private delegate TValue DequeueDelegate(); 
    public virtual TValue Dequeue() 
    { 
     if (dispatcher.CheckAccess()) 
     { 
      --count; 
      var pair = dict.First(); 
      var queue = pair.Value; 
      var val = queue.Dequeue(); 
      if (queue.Count == 0) dict.Remove(pair.Key); 
      OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, val)); 
      return val; 
     } 
     else 
     { 
      dispatcher.BeginInvoke(new DequeueDelegate(Dequeue)); 
     } 
    } 

Điều này rõ ràng sẽ không làm việc, bởi vì dispatcher.BeginInvoke không trả lại bất cứ điều gì. Tôi phải làm gì bây giờ?

+0

Bài đăng trên blog đó là 4 tuổi và họ vẫn chưa sửa nó: ( – mpen

+0

+1 Tôi sẽ quan tâm để xem câu trả lời cho câu hỏi này bởi vì tôi cần phải làm điều gì đó tương tự trong dự án của riêng mình. –

Trả lời

2

Gọi Invoke thay cho BeginInvoke. Điều này sẽ chạy nó trên luồng của người điều phối, nhưng sẽ thực thi đồng bộ và trả về kết quả được trả về bởi đại biểu.

Nếu bạn không cần kết quả ngay lập tức, hãy giữ lại DispatcherOperation được trả lại bởi BeginInvoke. Khi bạn cần kết quả, hãy gọi phương thức Wait của hoạt động và nếu trả lại DispatcherOperationStatus.Completed, hãy đọc thuộc tính Result.

+0

Oh ... đã không nhận ra 'Invoke' sẽ trả lại kết quả cho tôi :) – mpen

+0

Yep ... hoạt động tốt đủ cho nhu cầu của tôi. – mpen

Các vấn đề liên quan