2010-03-12 16 views
5

मेरे पास एक कॉन्टेक्स्टमेनूस्ट्रिप नियंत्रण है जो आपको एक क्रिया निष्पादित करने की अनुमति देता है दो अलग-अलग स्वाद है: Sync और Asyncएक्शन टी सिंक्रोनस और एसिंक्रोनस

मैं जेनेरिक्स का उपयोग कर तो मैं ऐसा किया सब कुछ कवर करने के लिए कोशिश कर रहा हूँ:

public class BaseContextMenu<T> : IContextMenu 
{ 
    private T executor; 

    public void Exec(Action<T> action) 
    { 
     action.Invoke(this.executor); 
    } 

    public void ExecAsync(Action<T> asyncAction) 
    { 
     // ... 
    } 

मैं कैसे आदेश सामान्य कार्रवाई अमल करने के लिए और इस बीच में मेनू के साथ 'कुछ करने' में async विधि लिख सकता है? मैंने देखा कि BeginInvoke के हस्ताक्षर की तरह कुछ है:

asyncAction.BeginInvoke(this.executor, IAsyncCallback, object); 

उत्तर

8

यहाँ नेट अतुल्यकालिक प्रोग्रामिंग मॉडल पर जेफरी रिक्टर लेख है। यहाँ

public class BaseContextMenu<T> : IContextMenu 
{ 
    private T executor; 

    public void Exec(Action<T> action) 
    { 
     action.Invoke(this.executor); 
    } 

    public void ExecAsync(Action<T> asyncAction, AsyncCallback callback) 
    { 
     asyncAction.BeginInvoke(this.executor, callback, asyncAction); 
    } 
} 

और एक कॉलबैक विधि ExecAsync के लिए पारित किया जा सकता है: http://msdn.microsoft.com/en-us/magazine/cc163467.aspx

यहाँ कैसे BeginInvoke इस्तेमाल किया जा सकता का एक उदाहरण है

private void Callback(IAsyncResult asyncResult) 
{ 
    Action<T> asyncAction = (Action<T>) asyncResult.AsyncState; 
    asyncAction.EndInvoke(asyncResult); 
} 
+0

मुझे एक नज़र डालें – Raffaeu

+0

धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था। मुझे लैम्ब्डा अभिव्यक्ति के साथ सिर्फ एक मुद्दा था, मुझे बहुभाषी प्रोग्रामिंग पर एक कोर्स की आवश्यकता नहीं थी। रेफरी के लिए ;-) – Raffaeu

+0

+1। जेफ के लेख में। वह वास्तव में अंतर्दृष्टिपूर्ण था और मुझे बहुत मदद मिली। – IAbstract

2

सबसे आसान विकल्प:

// need this for the AsyncResult class below 
using System.Runtime.Remoting.Messaging; 

public class BaseContextMenu<T> : IContextMenu 
{ 
    private T executor; 

    public void Exec(Action<T> action) { 
     action.Invoke(this.executor); 
    } 

    public void ExecAsync(Action<T> asyncAction) { 
     // specify what method to call when asyncAction completes 
     asyncAction.BeginInvoke(this.executor, ExecAsyncCallback, null); 
    } 

    // this method gets called at the end of the asynchronous action 
    private void ExecAsyncCallback(IAsyncResult result) { 
     var asyncResult = result as AsyncResult; 
     if (asyncResult != null) { 
      var d = asyncResult.AsyncDelegate as Action<T>; 
      if (d != null) 
       // all calls to BeginInvoke must be matched with calls to 
       // EndInvoke according to the MSDN documentation 
       d.EndInvoke(result); 
     } 
    } 
} 
संबंधित मुद्दे