2013-03-26 8 views
6

Json.net तरह json को कोई चीज परिवर्तित करने के लिए async कार्य लेखन:Json.net Async जब फ़ाइल

jsn = await JsonConvert.DeserializeObjectAsync<T> 

लेकिन जब मैं एक json के लिए वस्तु writea करना चाहते हैं फ़ाइल यह करने के लिए मेरे लिए बेहतर लगता है सीधे एक फ़ाइल स्ट्रीम का उपयोग करें।

तो मैं यह कुछ इस तरह होना चाहिए लगता है:

var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite); 

    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
    { 
     using (StreamWriter sw = new StreamWriter(fileStream.AsStreamForWrite())) 
     { 
      using (JsonWriter jw = new JsonTextWriter(sw)) 
      { 
       jw.Formatting = Formatting.Indented; 

       JsonSerializer serializer = new JsonSerializer(); 
       serializer.Serialize(jw, obj); 
      } 
     } 

लेकिन JsonSerzializer वस्तु मैं async तरीकों नहीं मिल सकता है पर। इसके अलावा मुझे लगता है कि आईओ संचालन को अपने धागे में नहीं रखा जाना चाहिए।

अनुशंसित दृष्टिकोण क्या है?

उत्तर

9

जेसन.NET वास्तव में एसिंक्रोनस डी-/क्रमबद्धता का समर्थन नहीं करता है। JsonConvert पर async विधियां सिंक्रोनस विधियों पर केवल रैपर हैं जो उन्हें किसी अन्य थ्रेड (which is exactly what a library shouldn't do) पर चलाती हैं।

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

+0

उनका कहना है कि बाहर के लिए धन्यवाद। मैं पहले से ही सोच रहा था कि स्ट्रिंग ऑपरेशन गैर थ्रेडेड एसिंक्रोन कैसे हो सकता है .. स्ट्रीमिंग को एसिंक्रोन बनाया जा सकता है। शायद यह Json.net के लिए एक सुविधा होगी लेकिन स्पष्ट रूप से यह अभी तक प्रत्यारोपित नहीं है। तो आपके उत्तर के लिए धन्यवाद। –

+0

यह पूरा करने के लिए एक आसान काम होगा - JSON.Net का एसिंक कांटा बनाना। हालांकि समस्या यह है कि इसमें काफी समय लगेगा - किसी को भी 80 घंटे अतिरिक्त आराम मिलेगा? यदि अधिक नहीं है? – Todd

4

यह कोड भी देखें, जो सही असीमित तरीके का उपयोग करता है (उदाहरण के लिए यह LOH स्मृति आवंटन से बचने के लिए विशाल बाइट एरे नहीं बनाएगा, यह आईओ ऑपरेशन को पूरा करने की प्रतीक्षा नहीं करेगा)।

using (var file = File.Open(destination, FileMode.Create)) 
{ 
    using (var memoryStream = new MemoryStream()) 
    { 
     using (var writer = new StreamWriter(memoryStream)) 
     { 
      var serializer = JsonSerializer.CreateDefault(); 

      serializer.Serialize(writer, data); 

      await writer.FlushAsync().ConfigureAwait(false); 

      memoryStream.Seek(0, SeekOrigin.Begin); 

      await memoryStream.CopyToAsync(file).ConfigureAwait(false); 
     } 
    } 

    await file.FlushAsync().ConfigureAwait(false); 
} 

पूरे फ़ाइल: https://github.com/imanushin/AsyncIOComparison/blob/0e2527d5c00c2465e8fd2617ed8bcb1abb529436/IntermediateData/FileNames.cs

+1

आईएमएचओ, यह उत्तर स्वीकार किए गए उत्तर से बेहतर है, स्वीकार्य उत्तर पर विचार करने से उपयोगकर्ता पूरी तरह से इस तथ्य को अनदेखा कर रहा है कि उपयोगकर्ता आईओ करने का प्रयास कर रहा था और कोई वास्तविक उदाहरण नहीं देता है। –