2010-05-08 15 views
5

hints laid out here पालन करने के लिए कोशिश कर रहा है, लेकिन वह यह कैसे संभाल करने का उल्लेख नहीं है जब अपने संग्रह, मान तो तरह करने की जरूरत है:,अन्य धागे से वस्तुओं को लौटाना?

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)); 
     } 
    } 

यह स्पष्ट रूप से काम नहीं करेगा क्योंकि dispatcher.BeginInvoke वापस नहीं करता है कुछ भी। मुझे क्या करना चाहिए?

+0

वह ब्लॉग पोस्ट 4 साल पुराना है और उन्होंने अभी भी इसे ठीक नहीं किया है :( – mpen

+0

+1 मुझे इस प्रश्न का उत्तर देखने में दिलचस्पी होगी क्योंकि मुझे अपनी खुद की एक परियोजना में कुछ ऐसा करने की ज़रूरत है। –

उत्तर

2

के स्थान पर Invoke पर कॉल करें। यह इसे प्रेषक के धागे पर चलाएगा, लेकिन समकालिक रूप से निष्पादित करेगा और प्रतिनिधि द्वारा लौटाए गए परिणाम को वापस कर देगा।

यदि आपको तुरंत परिणाम की आवश्यकता नहीं है, तो पर BeginInvoke पर लौटें। जब आपको परिणाम की आवश्यकता होती है, तो ऑपरेशन की Wait विधि पर कॉल करें और, यदि यह DispatcherOperationStatus.Completed देता है, तो Result संपत्ति पढ़ें।

+0

ओह ... 'Invoke' का एहसास नहीं हुआ मुझे परिणाम वापस कर देगा :) – mpen

+0

हाँ ... मेरी ज़रूरतों के लिए पर्याप्त काम करता है। – mpen

संबंधित मुद्दे