2016-03-02 10 views
13

क्या .net फ्रेमवर्क में async अंतर्निहित लाइब्रेरी/असेंबली है जो फ़ाइल सिस्टम (उदा। File.ReadAllBytes, File.WriteAllBytes) के साथ काम करने की अनुमति देती है?क्या .NET फ्रेमवर्क फ़ाइल-सिस्टम के साथ काम करने के लिए async विधियां प्रदान करता है?

या मुझे asyncStreamReader और StreamWriter के तरीके का उपयोग करके अपनी खुद की लाइब्रेरी लिखनी है?

कुछ इस तरह सुंदर अच्छा होगा:

var bytes = await File.ReadAllBytes("my-file.whatever"); 

उत्तर

13

.नेट फ्रेमवर्क एक async अंतर्निर्मित संग्रहालय में/विधानसभा जो फाइल सिस्टम

हाँ के साथ काम करने की अनुमति देता है है। फ़ाइल सिस्टम के साथ काम करने के लिए async विधियां हैं लेकिन स्थिर File प्रकार पर सहायक विधियों के लिए नहीं। वे FileStream पर हैं।

तो, वहाँ कोई File.ReadAllBytesAsync है, लेकिन उदाहरण के लिए FileStream.ReadAsync वहाँ, आदि:

byte[] result; 
using (FileStream stream = File.Open(@"C:\file.txt", FileMode.Open)) 
{ 
    result = new byte[stream.Length]; 
    await stream.ReadAsync(result, 0, (int)stream.Length); 
} 
+0

यदि फ़ाइल जिसे आप बाइट स्ट्रीम में क्रमबद्ध कर रहे थे, तो बड़ी (3 जीबी +) बड़ी संभावना थी कि स्ट्रीम की लंबाई एक इंट टाइप की तुलना में बड़ी होगी और इसे ओवरफ्लो के लिए कैसा लगा सकता है? – Dave

+1

@ डेव शायद। ऐसे मामलों में आपको शायद भाग में पढ़ने की जरूरत है। – i3arnon

+0

आपको भले ही भाग में पढ़ने के लिए तर्क होना चाहिए। [माइक्रोसॉफ्ट प्रलेखन] के अनुसार (https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.readasync?view=netframework-4.7.1#System_IO_FileStream_ReadAsync_System_Byte___System_Int32_System_Int32_System_Threading_CancellationToken_), ReadAsync को भरने की गारंटी नहीं है पूरी सरणी आपको यह देखने के लिए रिटर्न वैल्यू की जांच करनी होगी कि यह कितना _actually_ पढ़ा गया है। – Phil

11

यह पहले से ही होता है। उदाहरण के लिए देखें Using Async for File Access एमएसडीएन लेख।

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

आप एक पृष्ठभूमि कार्य में किसी फ़ाइल को लिखने के लिए है, तो आप एक async विधि में sincronously यह लिख सकते हैं।

static void Main(string[] args) 
{ 
    Console.WriteLine("1"); 
    // thread 1, sync 
    byte[] dataToWrite = System.Text.ASCIIEncoding.ASCII.GetBytes("my custom data"); 
    Task.Run(() => 
    { 
     Console.WriteLine("2"); 
     // aspetto un secondo 
     System.Threading.Thread.Sleep(1000); 
     // thread 2, async code 
     System.IO.File.WriteAllBytes(@"c:\temp\prova.txt", dataToWrite); 
     Console.WriteLine("2, end"); 
    }); 

    Console.WriteLine("3, exit"); 

    Console.ReadLine(); 
    // thread 1 
} 

निष्पादन उत्पादन होगा: 1,3,2,2 अंत

+5

यह असीमित और बहुत बुरी सलाह नहीं है। – i3arnon

+0

आप उस कार्य का इंतजार नहीं करते हैं। साथ ही, यह शायद ही कभी आईओसीपी – MickyD

+0

का उपयोग कर रहा है क्यों यह async माफी नहीं है? अगर आपको –

4

.नेट फ्रेमवर्क एक async अंतर्निर्मित संग्रहालय में/विधानसभा जो फाइल सिस्टम के साथ काम करने की अनुमति देता है (है क्या उदाहरण के लिए File.ReadAllBytes, File.WriteAllBytes)?

दुर्भाग्य से, डेस्कटॉप एपीआई जब यह अतुल्यकालिक फ़ाइल संचालन की बात आती है एक सा असमान हैं। जैसा कि आपने नोट किया है, कई अच्छी सुविधा विधियों में असीमित समकक्ष नहीं हैं। फाइलों के एसिंक्रोनस खोलने भी खो रहे हैं (जो नेटवर्क शेयर पर फ़ाइलों को खोलते समय विशेष रूप से उपयोगी होता है)।

मुझे उम्मीद है कि इन एपीआई को दुनिया के रूप में .NET कोर में ले जाया जाएगा।

या क्या मुझे StreamReader और StreamWriter के async विधियों का उपयोग करके अपनी खुद की लाइब्रेरी लिखनी है?

यह अभी सबसे अच्छा तरीका है।

ध्यान दें कि जब ReadAsync/WriteAsync और दोस्तों का उपयोग कर, आप स्पष्ट अतुल्यकालिक पहुँच के लिए फ़ाइल को खोलने चाहिए। ऐसा करने का एकमात्र तरीका (वर्तमान में) FileStream कन्स्ट्रक्टर अधिभार का उपयोग करना है जो bool isAsync पैरामीटर (true गुजर रहा है) या FileOptions पैरामीटर (FileOptions.Asynchronous गुजर रहा है) का उपयोग करना है। तो आप File.Open जैसी सुविधा खुली विधियों का उपयोग नहीं कर सकते हैं।

+1

उस जानकारी के लिए धन्यवाद और विशेष रूप से: 'FileOptions.Asynchronous' धन्यवाद! 'issync' को वंचित माना जाता है। +1 – BendEg

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