Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Dosyalara erişmek için Asenkron özelliğini kullanabilirsiniz. Zaman Uyumsuz özelliğini kullanarak, geri çağırmaları kullanmadan veya kodunuzu birden çok yönteme veya lambda ifadesine bölmeden zaman uyumsuz yöntemlere çağrı yapabilirsiniz. Senkron kodu asenkron hale getirmek için, senkron bir yöntem yerine asenkron bir yöntem çağırır ve kodunuza birkaç anahtar sözcük eklersiniz.
Dosya erişim çağrılarına zaman uyumsuz eklemenin aşağıdaki nedenlerini göz önünde bulundurabilirsiniz:
Zaman uyumsuzluk, işlemi başlatan kullanıcı arabirimi iş parçacığı başka işler gerçekleştirebildiğinden, kullanıcı arayüzü uygulamalarını daha duyarlı hale getirir. Ui iş parçacığının uzun süren bir kod yürütmesi gerekiyorsa (örneğin, 50 milisaniyeden fazla), kullanıcı arabirimi G/Ç tamamlanana kadar donabilir ve kullanıcı arabirimi iş parçacığı klavye ve fare girişini ve diğer olayları yeniden işleyebilir.
Zaman uyumsuzluğu, iş parçacığı gereksinimini azaltarak ASP.NET ve diğer sunucu tabanlı uygulamaların ölçeklenebilirliğini artırır. Uygulama yanıt başına ayrılmış bir iş parçacığı kullanıyorsa ve bin istek aynı anda işleniyorsa, bin iş parçacığı gerekir. Eşzamanlı olmayan işlemler genellikle bekleme sırasında bir thread kullanmak zorunda değildir. Mevcut G/Ç tamamlama iş parçacığını işlemin sonunda kısa bir süreliğine kullanırlar.
Geçerli koşullarda dosya erişim işleminin gecikme süresi çok düşük olabilir, ancak gelecekte gecikme süresi büyük ölçüde artabilir. Örneğin, bir dosya dünyanın her yanındaki bir sunucuya taşınabilir.
Asenkron özelliğini kullanmanın ek yükü küçüktür.
Zaman uyumsuz görevler kolayca paralel olarak çalıştırılabilir.
Örnekleri Çalıştırma
Bu konudaki örnekleri çalıştırmak için bir WPF Uygulaması veya Windows Forms Uygulaması oluşturabilir ve ardından bir Düğme ekleyebilirsiniz. Düğmenin Click olayında, her örnekteki ilk yönteme bir çağrı ekleyin.
Aşağıdaki örneklerde aşağıdaki Imports deyimleri ekleyin.
Imports System
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.IO
Imports System.Text
Imports System.Threading.Tasks
FileStream Sınıfının Kullanımı
Bu konudaki örneklerde, işletim sistemi düzeyinde zaman uyumsuz G/Ç oluşmasına neden olan bir seçeneği bulunan FileStream sınıfı kullanılır. Bu seçeneği kullanarak birçok durumda ThreadPool iş parçacığını engellemekten kaçınabilirsiniz. Bu seçeneği etkinleştirmek için oluşturucu çağrısında useAsync=true veya options=FileOptions.Asynchronous bağımsız değişkenini belirtirsiniz.
Bu seçeneği, bir dosya yolu belirterek StreamReader ve StreamWriter doğrudan açarsanız kullanamazsınız. Ancak, bir Stream sağlar ve FileStream sınıfının açmasına izin verirseniz bu seçeneği kullanabilirsiniz. Kullanıcı arabirimi iş parçacığı bekleme süresince engellenmediği için, ThreadPool iş parçacığı engellenmiş olsa bile kullanıcı arabirimi uygulamalarında zaman uyumsuz çağrıların daha hızlı olduğunu unutmayın.
Metin Yazma
Aşağıdaki örnek bir dosyaya metin yazar. Her bir 'await' ifadesinde, metot anında durur ve çıkar. G/Ç dosyası işlemleri tamamlandığında, yöntem await deyimini izleyen deyimde devam eder. Async değiştiricisinin, await ifadesini kullanan yöntemlerin tanımında yer aldığını unutmayın.
Public Async Sub ProcessWrite()
Dim filePath = "temp2.txt"
Dim text = "Hello World" & ControlChars.CrLf
Await WriteTextAsync(filePath, text)
End Sub
Private Async Function WriteTextAsync(filePath As String, text As String) As Task
Dim encodedText As Byte() = Encoding.Unicode.GetBytes(text)
Using sourceStream As New FileStream(filePath,
FileMode.Append, FileAccess.Write, FileShare.None,
bufferSize:=4096, useAsync:=True)
Await sourceStream.WriteAsync(encodedText, 0, encodedText.Length)
End Using
End Function
Özgün örnekte, aşağıdaki iki ifadenin Await sourceStream.WriteAsync(encodedText, 0, encodedText.Length) ile kısaltılmış şekli olan ifade bulunur.
Dim theTask As Task = sourceStream.WriteAsync(encodedText, 0, encodedText.Length)
Await theTask
İlk ifade bir görevi döndürür ve dosya işlemenin başlamasına neden olur. await ile ikinci ifade, yöntemin hemen sona erip farklı bir görev döndürmesine neden olur. Dosya işleme işlemi daha sonra tamamlandığında yürütme, await öğesini izleyen deyimine döner. Daha fazla bilgi için bkz. Zaman Uyumsuz Programlarda Denetim Akışı (Visual Basic).
Metin Okuma
Aşağıdaki örnek bir dosyadan metin okur. Metin arabelleğe alınır ve bu durumda StringBuilder içine yerleştirilir. Önceki örnekten farklı olarak, await ifadesinin değerlendirilmesi bir değer üretir.
ReadAsync yöntemi bir Task<Int32> döndürür, bu nedenle await değerlendirmesi işlem tamamlandıktan sonra bir Int32 değer (numRead) üretir. Daha fazla bilgi için bkz . Zaman Uyumsuz Dönüş Türleri (Visual Basic).
Public Async Sub ProcessRead()
Dim filePath = "temp2.txt"
If File.Exists(filePath) = False Then
Debug.WriteLine("file not found: " & filePath)
Else
Try
Dim text As String = Await ReadTextAsync(filePath)
Debug.WriteLine(text)
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try
End If
End Sub
Private Async Function ReadTextAsync(filePath As String) As Task(Of String)
Using sourceStream As New FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.Read,
bufferSize:=4096, useAsync:=True)
Dim sb As New StringBuilder
Dim buffer As Byte() = New Byte(&H1000) {}
Dim numRead As Integer
numRead = Await sourceStream.ReadAsync(buffer, 0, buffer.Length)
While numRead <> 0
Dim text As String = Encoding.Unicode.GetString(buffer, 0, numRead)
sb.Append(text)
numRead = Await sourceStream.ReadAsync(buffer, 0, buffer.Length)
End While
Return sb.ToString
End Using
End Function
Paralel Asenkron G/Ç
Aşağıdaki örnek, 10 metin dosyası yazarak paralel işlemeyi gösterir. Her dosya için WriteAsync yöntemi, daha sonra bir görev listesine eklenen bir görev döndürür.
Await Task.WhenAll(tasks) ifade, yöntemden çıkar ve tüm görevler için dosya işlemi tamamlandığında yöntem içinde yeniden başlar.
Örnek, görevler tamamlandıktan sonra bir FileStream bloktaki tüm Finally örnekleri kapatır. Eğer FileStream'nin her biri bir Imports ifadesinde oluşturulsaydı, FileStream görev tamamlanmadan önce yok edilebilir.
Herhangi bir performans artışının zaman uyumsuz işlemeden değil neredeyse tamamen paralel işlemeden kaynaklandığını unutmayın. Zaman uyumsuzliğin avantajları, birden çok iş parçacığını bağlamaması ve kullanıcı arabirimi iş parçacığını bağlamamasıdır.
Public Async Sub ProcessWriteMult()
Dim folder = "tempfolder\"
Dim tasks As New List(Of Task)
Dim sourceStreams As New List(Of FileStream)
Try
For index = 1 To 10
Dim text = "In file " & index.ToString & ControlChars.CrLf
Dim fileName = "thefile" & index.ToString("00") & ".txt"
Dim filePath = folder & fileName
Dim encodedText As Byte() = Encoding.Unicode.GetBytes(text)
Dim sourceStream As New FileStream(filePath,
FileMode.Append, FileAccess.Write, FileShare.None,
bufferSize:=4096, useAsync:=True)
Dim theTask As Task = sourceStream.WriteAsync(encodedText, 0, encodedText.Length)
sourceStreams.Add(sourceStream)
tasks.Add(theTask)
Next
Await Task.WhenAll(tasks)
Finally
For Each sourceStream As FileStream In sourceStreams
sourceStream.Close()
Next
End Try
End Sub
WriteAsync ve ReadAsync yöntemlerini kullanırken, işlemi akışın ortasında iptal etmek için kullanabileceğiniz bir CancellationToken belirtebilirsiniz. Daha fazla bilgi için bkz. Fine-Tuning Zaman Uyumsuz Uygulamanız (Visual Basic) ve Yönetilen İş Parçacıklarında İptal.