2016-11-02 32 views
5

Bir projede .NET 4.0 ile takılıyorum. StreamReader, ReadLine'ın Async veya Begin/End sürümlerini sunmaz. Temel Aktarım nesnesinin BeginRead/BeginEnd özelliği vardır, ancak bunlar bayt dizisini alır, bu yüzden satır satır okumak için mantığı uygulamak zorunda kalırdım.StreamReader.ReadLineAsync için .NET 4.0 değiştirme var mı?

Bunu başarmak için 4.0 Çerçevesinde bir şey var mı?

+0

UI iş parçacığı engelleme olmadan bunu nasıl. .NET 4 hala TPL, iş parçacığı ve BackgroundWorkers içerir. –

+0

Sorunuz belirsiz. ReadLineAsync() ', özellikle diğer ilgili özelliklere, özellikle" async "/" await "öğesine sahipseniz kullanışlıdır. .NET 4.0 için Async CTP veya Async Hedefleme Paketi kullanıyor musunuz? Değilse, ReadLineAsync() 'gibi bir yöntem kullanma planınız nedir? .NET'in zaten "ReadLineAsync()" gibi bir şey varsa, muhtemelen 4.5 olarak eklememiş olabileceğini unutmayın. Siz ya da bir başkasının yazması gerekecek ya da yazmış olacaksınız. –

+0

İstediğiniz tek şey, ReadLineAsync() 'ın _some_ uygulamasıysa, [.NET sürümünü 4.5'den kopyalayabilirsiniz] (https://referencesource.microsoft.com/#mscorlib/system/io/streamreader.cs,884afa7bffa068d0). Sonuçta açık kaynak. –

cevap

0

Yapmaya çalıştığınız bazı uyumsuz davranışları yapmak için Görev Paralel Kitaplığı'nı (TPL) kullanabilirsiniz.

Wrap bir görevde senkron yöntemi: StreamReader için bu çok yapmak gerekirse benzetmek istiyorsanız

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; 

, daha sonra StreamReader için bir uzantısı yöntem haline bu bulunmaya devam edebilir düzenli asenkron yöntemler. Sadece TPL kullanarak hata işleme ve diğer quirks dikkat edin.

+0

Elbette, ama bir ThreadPool parçasını engellemem. StreamReader.ReadLineAsync'i varsayıyordum.() aslında bir iş parçacığını engellemeden yapabilirdi. – Asik

1

Task'u kullanabilirsiniz. Kodunuzun başka bir bölümünü belirtmiyorsunuz, bu yüzden ne yapmak istediğinizi bilmiyorum. Task.Wait kullanmaktan kaçınmanızı tavsiye ediyorum çünkü bu UI iş parçacığını engelliyor ve görevin bitmesini beklemiyor, bu gerçekten async olmadı! Dosyada görev okunduktan sonra başka bir eylem yapmak isterseniz, task.ContinueWith'u kullanabilirsiniz.

İşte tam bir örnek, sadece bir arka plan iş parçacığı okuma yapabileceği

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(); 
    }