From c2a54cf7541af7d434573eb5548007b73a71474c Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Sun, 24 Jan 2016 21:25:10 -0800 Subject: [PATCH] Update SharedTextWriter Using a BlockedCollection instead of spin off a thread for each write action. --- .../Services/SharedTextWriter.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/OmniSharp.Stdio/Services/SharedTextWriter.cs b/src/OmniSharp.Stdio/Services/SharedTextWriter.cs index 88571d5a39..2a67aada49 100644 --- a/src/OmniSharp.Stdio/Services/SharedTextWriter.cs +++ b/src/OmniSharp.Stdio/Services/SharedTextWriter.cs @@ -1,21 +1,33 @@ -using System.IO; +using System.Collections.Concurrent; +using System.IO; +using System.Threading; using System.Threading.Tasks; namespace OmniSharp.Stdio.Services { public class SharedTextWriter : ISharedTextWriter { + private BlockingCollection _queue = new BlockingCollection(); + private readonly object _lock = new object(); private readonly TextWriter _writer; public SharedTextWriter(TextWriter writer) { _writer = writer; + + var thread = new Thread(() => { while (true) WriteLine(_queue.Take()); }) + { + Name = $"{nameof(SharedTextWriter)} {nameof(BlockingCollection)}", + IsBackground = true + }; + + thread.Start(); } public void WriteLine(object value) { - lock(_lock) + lock (_lock) { _writer.WriteLine(value); } @@ -23,7 +35,9 @@ public void WriteLine(object value) public Task WriteLineAsync(object value) { - return Task.Factory.StartNew(() => WriteLine(value)); + _queue.Add(value); + + return Task.FromResult(0); } } }