2011-12-20 18 views
12

का उपयोग करके सशर्त रूप से एक कोड को सशक्त रूप से चलाने के लिए कैसे करें मेरे पास संसाधनों को पुनर्प्राप्त करने का एक प्रभारी है जो उन्हें त्वरित पहुंच के लिए भी कैश करता है। वर्ग एक संसाधन पुन: प्राप्त करने के लिए एक अतुल्यकालिक विधि को उजागर करता है:कार्य

public Task<object> GetResourceAsync(string resourceName) 
{ 
    return Task.Factory.StartNew<object>(() => 
    { 
     // look in cache 

     // if not found, get from disk 

     // return resource 
    }); 
} 

ग्राहक कोड तो इस तरह दिखता है:

myResourceProvider.GetResourceAsync("myResource") 
    .ContinueWith<object>(t => Console.WriteLine("Got resource " + t.Result.ToString())); 

इस तरह, एक पृष्ठभूमि धागा हमेशा प्रयोग किया जाता है। हालांकि, मैं नहीं चाहता कि कोड कैश में पाया गया हो तो कोड असीमित रूप से चलाना चाहता है। यदि यह कैश में पाया गया था, तो मैं तुरंत संसाधन वापस करना चाहता हूं और किसी अन्य धागे का उपयोग नहीं करना चाहता हूं।

धन्यवाद।

उत्तर

19

.NET 4.5 में Task.FromResult है जो आपको Task<T> वापस करने देता है, लेकिन थ्रेडपूल थ्रेड पर एक प्रतिनिधि चलाने की बजाय, यह स्पष्ट रूप से कार्य का रिटर्न मान सेट करता है।

अपने कोड के संदर्भ में

तो:

public Task<object> AsyncGetResource(string resourceName) 
{ 
    object valueFromCache; 
    if (_myCache.TryGetValue(resourceName, out valueFromCache)) { 
     return Task.FromResult(valueFromCache); 
    } 
    return Task.Factory.StartNew<object>(() => 
    { 
     // get from disk 
     // add to cache 
     // return resource 
    }); 
} 

आप .NET 4.0 पर अभी भी हैं, तो आप TaskCompletionSource<T> उपयोग कर सकते हैं एक ही बात करने के लिए:

var tcs = new TaskCompletionSource<object>(); 
tcs.SetResult(...item from cache...); 
return tcs.Task; 
+0

यह वास्तव में क्या मैं है को ढूंढ रहा था। धन्यवाद! –

+0

+1 मैं इस सवाल से पूछ रहा था (http://stackoverflow.com/questions/15316613/real-life-scenarios-for-using-taskcompletionsourcet) और अब मैं देख सकता हूं कि मुझे इसका उपयोग कब करना चाहिए। –

+0

@Joe क्या आप कार्य के लिए इस कोड को बढ़ा सकते हैं (समाधान जोड़ना)। FromResult? –

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