2016-11-02 4 views
5

मैं एक परियोजना पर .NET 4.0 के साथ अटक गया हूँ। StreamReader रीडलाइन के As Ascc या Begin/End संस्करण प्रदान नहीं करता है। अंतर्निहित स्ट्रीम ऑब्जेक्ट में BeginRead/BeginEnd है लेकिन ये बाइट सरणी लेते हैं, इसलिए मुझे रेखा से लाइन पढ़ने के लिए तर्क लागू करना होगा।क्या StreamReader.ReadLineAsync के लिए .NET 4.0 प्रतिस्थापन है?

क्या यह प्राप्त करने के लिए 4.0 फ्रेमवर्क में कुछ है?

+0

तुम सिर्फ एक पृष्ठभूमि सूत्र में पढ़ने कर सकता को रोके बिना यह करने के लिए। .NET 4 में अभी भी टीपीएल, थ्रेड्स और पृष्ठभूमिवर्कर्स हैं। –

+0

आपका प्रश्न अस्पष्ट है। 'ReadLineAsync()' मुख्य रूप से उपयोगी है यदि आपके पास अन्य संबंधित सुविधाएं हैं, विशेष रूप से 'async'/'await'। क्या आप .NET 4.0 के लिए Async CTP या Async लक्ष्यीकरण पैक का उपयोग कर रहे हैं? यदि नहीं, तो 'ReadLineAsync() 'जैसी विधि का उपयोग करने के लिए आपकी योजना क्या है? ध्यान दें कि यदि .NET के पास पहले से ही 'ReadLineAsync()' जैसा कुछ था, तो शायद वे इसे 4.5 में जोड़ नहीं पाएंगे। आप या किसी और को लिखना होगा, या इसे पहले से ही लिखना होगा। –

+0

यदि आप चाहते हैं कि 'ReadLineAsync()' _some_ कार्यान्वयन है, तो आप केवल [.NET संस्करण 4.5 से कॉपी कर सकते हैं] (https://referencesource.microsoft.com/#mscorlib/system/io/streamreader.cs,884afa7bffa068d0)। यह सब के बाद, खुला स्रोत है। –

उत्तर

0

आप कुछ एसिंक व्यवहार करने के लिए कार्य समांतर लाइब्रेरी (टीपीएल) का उपयोग कर सकते हैं जो आप करने का प्रयास कर रहे हैं।

लपेटें एक कार्य में तुल्यकालिक विधि:

var asyncTask = Task.Run(() => YourMethod(args, ...)); 
var asyncTask.Wait(); // You can also Task.WaitAll or other methods if you have several of these that you want to run in parallel. 
var result = asyncTask.Result; 

आप StreamReader के लिए इस एक बहुत क्या करने की जरूरत है, तो आप पर StreamReader के लिए एक विस्तार विधि में इस बनाने के लिए जा सकते हैं आप अनुकरण करना चाहते हैं नियमित async विधियों। बस टीपीएल का उपयोग करने में त्रुटि प्रबंधन और अन्य quirks के साथ ख्याल रखना।

+0

निश्चित रूप से, लेकिन मैं थ्रेडपूल थ्रेड को अवरुद्ध नहीं करना चाहता था। मैं StreamReader.ReadLineAsync मान रहा था() वास्तव में धागे को अवरुद्ध किए बिना ऐसा कर सकता है। – Asik

1

आप Task का उपयोग कर सकते हैं। आप अपने कोड का अन्य भाग निर्दिष्ट नहीं करते हैं, इसलिए मुझे नहीं पता कि आप क्या करना चाहते हैं। मैं आपको सलाह देता हूं कि Task.Wait का उपयोग करने से बचें क्योंकि यह यूआई थ्रेड को अवरुद्ध कर रहा है और कार्य को समाप्त करने की प्रतीक्षा कर रहा है, जो वास्तव में असीमित नहीं बन गया है! यदि आप कार्य में फ़ाइल को पढ़ने के बाद कुछ अन्य कार्य करना चाहते हैं, तो आप task.ContinueWith का उपयोग कर सकते हैं।

यहाँ पूर्ण उदाहरण के लिए, कैसे यूआई धागा

static void Main(string[] args) 
    { 
     string filePath = @"FILE PATH"; 
     Task<string[]> task = Task.Run<string[]>(() => ReadFile(filePath)); 

     bool stopWhile = false; 

     //if you want to not block the UI with Task.Wait() for the result 
     // and you want to perform some other operations with the already read file 
     Task continueTask = task.ContinueWith((x) => { 
      string[] result = x.Result; //result of readed file 

      foreach(var a in result) 
      { 
       Console.WriteLine(a); 
      } 

      stopWhile = true; 
      }); 

     //here do other actions not related with the result of the file content 
     while(!stopWhile) 
     { 
      Console.WriteLine("TEST"); 
     } 

    } 

    public static string[] ReadFile(string filePath) 
    { 
     List<String> lines = new List<String>(); 
     string line = ""; 
     using (StreamReader sr = new StreamReader(filePath)) 
     { 
      while ((line = sr.ReadLine()) != null) 
       lines.Add(line); 
     } 
     Console.WriteLine("File Readed"); 
     return lines.ToArray(); 
    }