2013-02-06 25 views
13

साथ पहले मैं एक धागे से WPF के प्रदर्शन को अपडेट करनेDispatch.Invoke (नई लड़ाई ...) एक पैरामीटर

Dispatcher.Invoke(new Action(() => colorManager.Update())); 

था। डिज़ाइन के कारण, मुझे प्रोग्राम को बदलना पड़ा, और मुझे ColorImageFrame पैरामीटर को मेरे ColorStreamManager.Update() विधि में पास करना होगा।

Dispatcher.Invoke(new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v))); 

यह ठीक संकलित लेकिन बिल्कुल नहीं चल जाएगा:

this लिंक के बाद, मैं अपने डिस्पैचर संशोधित। वीएस -2010 का कहना है "पैरामीटर गिनती मेल नहीं खाता।" मेरे ColorStreamManager.Update() विधि में मेरे पास RaisePropertyChanged(() => Bitmap) है;

कोई बता सकता है कि मैं गलत कहां गया?

ColorStreamManager.Update() विधि के हस्ताक्षर है निम्नलिखित:

ColorStreamManager colorManager = ... 
ColorImageFrame frame = ... 

Dispatcher.Invoke(
    new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v)), 
    colorManager, 
    frame); 

:

public void Update(ColorImageFrame frame); 
+2

'ColorStreamManager.Update' की घोषणा किस तरह दिखती है? – Foggzie

+0

मैंने आपके प्रश्न का उत्तर देने के लिए अपना प्रश्न अपडेट किया – ikel

+0

@ikel हमें विधि के हस्ताक्षर, केवल पूरे कार्य को देखने की ज़रूरत नहीं है। – Servy

उत्तर

20

आप नहीं चाहते कि कार्रवाई पैरामीटर हो, क्योंकि Dispatcher यह जानने के लिए नहीं है कि विधि को क्या पास करना है। इसके बजाय आप क्या कर सकते हैं वैरिएबल पर बंद है:

ColorImageFrame someFrame = ...; 
Dispatcher.Invoke(new Action(() => colorManager.Update(someFrame))); 
+0

आह! _ "चर पर बंद करें" _ मुझे उस जानकारी का टुकड़ा चाहिए! – ikel

2

आप एक Action<T1, T2> प्रतिनिधि के साथ Invoke फोन हैं, तो आप आह्वान कॉल करने के लिए दो कार्रवाई पैरामीटर भेजने की जरूरत है आप जिस ओवरलोड का उपयोग कर रहे हैं उसे आमंत्रित करें Dispatcher.Invoke(Delegate, Object[]) है।

+0

यह इस तरह से गुजरने के बजाय चरों को बंद करने के लिए सिंटैक्टिक रूप से आसान और क्लीनर दोनों है। – Servy

+0

लेकिन यह सभी परिस्थितियों में काम नहीं करता है। बाहरी चरों को कैप्चर करने के लिए स्पष्ट रूप से उन्हें आमंत्रित करने से अलग किया जाता है। उदाहरण के लिए देखें [यहां] (http://stackoverflow.com/a/271447/1136211)। इसके अलावा ओपी ने स्पष्ट रूप से इस समाधान के लिए कहा है। – Clemens

+0

यह यहां लागू नहीं है क्योंकि 'Invoke' तुल्यकालिक है; जब प्रतिनिधि प्रतिनिधि चलाया जाता है तब तक यह वापस नहीं आएगा, और यह विधि रिटर्न के बाद कभी नहीं चलाया जाता है। अब अगर यह 'BeginInvoke' का उपयोग कर रहा था तो यदि आप सावधान नहीं हैं तो बंद करने वाले अर्थशास्त्र के साथ संभावित समस्याएं हैं। यदि आवश्यक हो तो एक प्रतिलिपि रखने के लिए ऐसे मुद्दों को हमेशा एक नए स्थानीय चर के सरल निर्माण द्वारा संबोधित किया जा सकता है। ओपी के अनुरोध के लिए, ओपी अनुरोध कर रहा है कि उसे 'अपडेट' विधि में ऑब्जेक्ट कैसे प्राप्त किया जाए, उसने कभी नहीं कहा कि बंद करने का उपयोग नहीं किया जा सका। – Servy