ठीक है मुझे एक ही समस्या थी। और अब इसे हल किया। यह देर से सुझाव है लेकिन दूसरों के लिए मदद कर सकता है।
नीचे दिए गए कंसोल उदाहरणों में निम्नलिखित कथन का उपयोग शामिल करें। नीचे
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
Use of the FileStream Class
उदाहरण FileStream वर्ग है, जो एक विकल्प है कि कारण बनता है अतुल्यकालिक मैं/हे ऑपरेटिंग सिस्टम स्तर पर होते हैं के लिए है का उपयोग करें। कई मामलों में, यह थ्रेडपूल थ्रेड को अवरुद्ध करने से बच जाएगा। इस विकल्प को सक्षम करने के लिए, आपको कन्स्ट्रक्टर कॉल में उपयोग Async = true या options = FileOptions.Asynchronous तर्क निर्दिष्ट करना होगा।
StreamReader और StreamWriter में यह विकल्प नहीं है यदि आप उन्हें फ़ाइल पथ निर्दिष्ट करके सीधे खोलते हैं। StreamReader/Writer के पास यह विकल्प होता है यदि आप उन्हें स्ट्रीम स्ट्रीम प्रदान करते हैं जो फ़ाइलस्ट्रीम क्लास द्वारा खोला गया था। ध्यान दें कि एसिंक्रॉमी यूआई ऐप्स में एक प्रतिक्रियात्मक लाभ प्रदान करता है भले ही थ्रेड पूल थ्रेड अवरुद्ध हो, क्योंकि यूआई थ्रेड प्रतीक्षा के दौरान अवरुद्ध नहीं है।
लेखन पाठ
निम्न उदाहरण एक फ़ाइल में पाठ लिखता है। प्रत्येक प्रतीक्षा कथन पर, विधि तुरंत बाहर निकलती है। जब फ़ाइल I/O पूर्ण हो जाती है, तो प्रतीक्षा प्रतीक्षा विवरण के बाद विधि कथन पर फिर से शुरू होती है। ध्यान दें कि async संशोधक विधियों की परिभाषा में है जो प्रतीक्षा कथन का उपयोग करते हैं।
static void Main(string[] args)
{
ProcessWrite().Wait();
Console.Write("Done ");
Console.ReadKey();
}
static Task ProcessWrite()
{
string filePath = @"c:\temp2\temp2.txt";
string text = "Hello World\r\n";
return WriteTextAsync(filePath, text);
}
static async Task WriteTextAsync(string filePath, string text)
{
byte[] encodedText = Encoding.Unicode.GetBytes(text);
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Append, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true))
{
await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
};
}
पाठ
निम्न उदाहरण पढ़ना एक फ़ाइल से पाठ पढ़ता है। पाठ buffered है और, इस मामले में, एक स्ट्रिंगबिल्डर में रखा गया है। पिछले उदाहरण के विपरीत, प्रतीक्षा का मूल्यांकन एक मूल्य पैदा करता है। ReadAsync विधि देता है एक टास्क, तो इंतजार है मूल्यांकन कोई Int32 मूल्य (numRead) उसके बाद आपरेशन पूरा करता दिया जाता है पैदा करता है ..
static void Main(string[] args)
{
ProcessRead().Wait();
Console.Write("Done ");
Console.ReadKey();
}
static async Task ProcessRead()
{
string filePath = @"c:\temp2\temp2.txt";
if (File.Exists(filePath) == false)
{
Console.WriteLine("file not found: " + filePath);
}
else {
try {
string text = await ReadTextAsync(filePath);
Console.WriteLine(text);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
static async Task<string> ReadTextAsync(string filePath)
{
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.Read,
bufferSize: 4096, useAsync: true))
{
StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[0x1000];
int numRead;
while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
string text = Encoding.Unicode.GetString(buffer, 0, numRead);
sb.Append(text);
}
return sb.ToString();
}
}
आप से Using Async for File Access
आशा एक देखने के मूल स्रोत ले जा सकते हैं जो मदद करता है ...
हाँ, यह संभव है। सुनिश्चित करें कि आप मुख्य धागे में फ़ाइल नहीं खोलते हैं और किसी अन्य का उपयोग करके संशोधित नहीं करते हैं। – Leri
मुझे कोड –
को संशोधित करना चाहिए यदि आप एक स्ट्रीम खोलते हैं तो अपवाद आमतौर पर होता है। दिए गए कोड उदाहरण के भीतर आप केवल एक मौजूदा स्ट्रीम को लिखते हैं, लेकिन वह कोड जहां आप स्ट्रीम बनाते हैं (और अपवाद फेंक दिया जाएगा) गायब है। – Oliver