2013-02-04 19 views
19

एक छोटी सी सवाल हो सकता है, लेकिन यह मुझे बुनियादी समझ में मदद कर सकता है।Task.Factory.StartNew बनाम Async तरीकों

वहाँ दो निम्नलिखित कार्यान्वयन के बीच कोई महत्वपूर्ण अंतर है?

  1. Task.Factory.StartNew:

    public Task<string> ReadAllTextAsync(string path) { 
        return Task.Factory.StartNew(() => File.ReadAllText(path)); 
    } 
    
  2. Async पद्धति पर StreamReader:

    public async Task<string> ReadAllTextAsync(string path) { 
        using (var stream = File.OpenRead(path)) 
        using (var reader = new StreamReader(stream)) { 
         return await reader.ReadToEndAsync(); 
        } 
    } 
    

उत्तर

22

हाँ, वहाँ एक महत्वपूर्ण अंतर है: जबकि का उपयोग करते समय Task.Factory.StartNew तुल्यकालन संदर्भ संरक्षण नहीं है async/इस संदर्भ का इंतजार संरक्षित है। ASP.NET अनुप्रयोग में उदाहरण के लिए इसका मतलब है कि अगर आप Task.Factory.StartNew का उपयोग HttpContext अगर आप async का उपयोग जबकि/इंतजार है यह उपलब्ध हो जाएगा काम के अंदर सुलभ नहीं हो सकता है।

वहाँ भी उदाहरण आपके द्वारा दी गई एक और महत्वपूर्ण अंतर है। पहले मामले में आप एक अवरुद्ध एपीआई का उपयोग कर रहे हैं: दूसरे मामले में जबकि File.ReadAllText(path) आप एक सच्चे अतुल्यकालिक मैं/हे कार्य में एक आई/ओ समापन पोर्ट का उपयोग कर रहे हैं। इसका मतलब है कि पहले मामले में आप इस धागे को खतरे में डाल रहे हैं जिस पर यह कार्य पूरे समय निष्पादित होता है, यह कार्य निष्पादित होता है जबकि दूसरे मामले में यह धागा एक I/O प्राप्ति पोर्ट के लिए नि: शुल्क धन्यवाद है।

+1

@dtb, हम वास्तव में एक ThreadPool बारे में बात नहीं कर सकते हैं जब कार्य के साथ काम कर। पहला उदाहरण थ्रेड को अवरुद्ध कर रहा है जिसमें कार्य निष्पादित होता है, जबकि दूसरे उदाहरण में यह नहीं होता है। मैंने इस जानकारी को शामिल करने के लिए अपना जवाब अपडेट कर दिया है। –

+2

+1। अच्छा जवाब – dtb

+1

धन्यवाद, यह स्पष्ट करता है (विशेष रूप से दूसरा बिंदु, मुझे संदेह था कि आईओ में कुछ अक्षमता है)। –

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