मैं इस सवाल पर पहुंचा कि एक खुली हुई वस्तुओं की सूची को एक पर स्ट्रीम करने का एक तरीका खोज रहा था System.IO.Stream
और भेजने से पहले पूरी सूची को बफर किए बिना उन्हें दूसरे छोर से पढ़ लिया। (विशेष रूप से मैं वेब एपीआई पर MongoDB से लगातार वस्तुओं को स्ट्रीमिंग कर रहा हूं।)
@Paul Tyng और @Rivers ने मूल प्रश्न का उत्तर देने के लिए एक उत्कृष्ट कार्य किया, और मैंने उनके उत्तरों का उपयोग अपनी समस्या के लिए अवधारणा का प्रमाण बनाने के लिए किया। मैंने अपना टेस्ट कंसोल ऐप यहां पोस्ट करने का फैसला किया, अगर किसी को भी इसी मुद्दे का सामना करना पड़ रहा है।
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace TestJsonStream {
class Program {
static void Main(string[] args) {
using(var writeStream = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.None)) {
string pipeHandle = writeStream.GetClientHandleAsString();
var writeTask = Task.Run(() => {
using(var sw = new StreamWriter(writeStream))
using(var writer = new JsonTextWriter(sw)) {
var ser = new JsonSerializer();
writer.WriteStartArray();
for(int i = 0; i < 25; i++) {
ser.Serialize(writer, new DataItem { Item = i });
writer.Flush();
Thread.Sleep(500);
}
writer.WriteEnd();
writer.Flush();
}
});
var readTask = Task.Run(() => {
var sw = new Stopwatch();
sw.Start();
using(var readStream = new AnonymousPipeClientStream(pipeHandle))
using(var sr = new StreamReader(readStream))
using(var reader = new JsonTextReader(sr)) {
var ser = new JsonSerializer();
if(!reader.Read() || reader.TokenType != JsonToken.StartArray) {
throw new Exception("Expected start of array");
}
while(reader.Read()) {
if(reader.TokenType == JsonToken.EndArray) break;
var item = ser.Deserialize<DataItem>(reader);
Console.WriteLine("[{0}] Received item: {1}", sw.Elapsed, item);
}
}
});
Task.WaitAll(writeTask, readTask);
writeStream.DisposeLocalCopyOfClientHandle();
}
}
class DataItem {
public int Item { get; set; }
public override string ToString() {
return string.Format("{{ Item = {0} }}", Item);
}
}
}
}
ध्यान दें कि आप एक अपवाद प्राप्त कर सकते हैं जब AnonymousPipeServerStream
निपटाया जाता है, तो मैंने इसे अनदेखा कर दिया क्योंकि यह हाथ में समस्या के लिए प्रासंगिक नहीं है।