Tôi đến câu hỏi này để tìm cách truyền một danh sách các đối tượng kết thúc mở lên System.IO.Stream
và đọc chúng từ đầu kia, mà không đệm toàn bộ danh sách trước khi gửi. (Cụ thể tôi đang phát trực tuyến các đối tượng từ MongoDB qua API Web.)
@Paul Tyng và @Rivers đã làm một công việc tuyệt vời để trả lời câu hỏi ban đầu và tôi đã sử dụng câu trả lời của họ để xây dựng một bằng chứng về khái niệm cho vấn đề của mình. Tôi quyết định đăng ứng dụng bảng điều khiển thử nghiệm của mình ở đây trong trường hợp bất kỳ ai khác đang gặp phải vấn đề tương tự.
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);
}
}
}
}
Lưu ý rằng bạn có thể nhận được một ngoại lệ khi AnonymousPipeServerStream
xử lý, tôi bỏ qua điều này vì nó không liên quan đến vấn đề trong tay.