2013-03-26 5 views
6

Json.net 같은 JSON으로 객체를 변환하기위한 비동기 기능이 파일에 기록 할 때 :Json.net 비동기은

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 개체에

. 또한 IO 작업을 자신의 스레드에 배치해서는 안된다 생각합니다.

권장 방법은 무엇입니까?

답변

9

Json.NET은 비동기 비 직렬화/직렬화를 실제로 지원하지 않습니다. JsonConvert의 비동기 메서드는 다른 스레드에서 실행하는 동기 메서드에 대한 래퍼입니다 (which is exactly what a library shouldn't do).

여기서 가장 좋은 방법은 다른 스레드에서 파일 액세스 코드를 실행하는 것입니다. 이렇게하면 async의 장점을 모두 얻을 수는 없지만 스레드가 낭비되지만 UI 스레드가 차단되지는 않습니다.

+0

감사합니다. 나는 이미 문자열 조작이 비동기식 스레드가 아닌지 궁금해했다. 스트리밍을 비동기 적으로 만들 수있다. 아마도 그것은 Json.net의 기능 일 것이지만 분명히 아직 암시되지 않습니다. 그래서 당신의 대답에 감사드립니다. –

+0

이것은 JSON.Net의 비동기 분기를 만드는 간단한 작업입니다. 그러나 문제는 시간이 오래 걸린다는 것입니다. 누구나 80 시간을 절약 할 수 있습니까? 더 이상 없다면? – Todd

4

올바른 비동기 방식을 사용하는이 코드도 참조하십시오 (예 : LOH 메모리 할당을 피하기 위해 거대한 바이트 배열을 만들지 않으며 IO 작업이 완료 될 때까지 기다리지 않음).

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

이 답변은 사용자가 입출력을 수행하려고 시도하고 있다는 사실을 완전히 무시하고 실제로 예를 제시하지 않는다는 점을 감안할 때,이 대답은 받아 들인 대답보다 낫습니다. –