public async Task RunStreamAsync(string streamName, ChannelReader <string> stream) { var streamHolder = new StreamHolder() { Source = stream }; // Add before yielding // This fixes a race where we tell clients a new stream arrives before adding the stream this._streams.TryAdd(streamName, streamHolder); await Task.Yield(); try { await foreach (var item in stream.ReadAllAsync()) { foreach (var viewer in streamHolder.Viewers) { try { await viewer.Value.Writer.WriteAsync(item); } catch { } } } } finally { RemoveStream(streamName); } }
public async Task RunStreamAsync(string streamName, IAsyncEnumerable <string> stream) { var streamHolder = new StreamHolder() { Source = stream }; // Add before yielding // This fixes a race where we tell clients a new stream arrives before adding the stream this.streams.TryAdd(streamName, streamHolder); await Task.Yield(); try { await foreach (string item in stream) { foreach (KeyValuePair <long, Channel <string> > viewer in streamHolder.Viewers) { try { await viewer.Value.Writer.WriteAsync(item); } catch { } } } } finally { this.RemoveStream(streamName); } }
public bool AddStream(string streamName, Channel <string> stream) { var streamHolder = new StreamHolder() { Source = stream }; _ = Task.Run(async() => { while (await stream.Reader.WaitToReadAsync()) { while (stream.Reader.TryRead(out var item)) { await streamHolder.Lock.WaitAsync(); try { foreach (var viewer in streamHolder.Viewers) { try { await viewer.Writer.WriteAsync(item); } catch { } } } finally { streamHolder.Lock.Release(); } } } }); return(_streams.TryAdd(streamName, streamHolder)); }
private static FileStream GetLogFileStream(Device device, DateTime now) { string path = GetDeviceLogPath(device, now); string deviceName = device.Name; if (streams.ContainsKey(deviceName)) { StreamHolder holder = streams[deviceName]; if (holder.FilePath.ToLower() == path.ToLower()) { return holder.FileStream; } else { FileStream fileStream = holder.FileStream; if (fileStream != null) { fileStream.Close(); fileStream.Dispose(); } streams.Remove(deviceName); } } StreamHolder newHolder = new StreamHolder() { FilePath = path }; if (!File.Exists(path)) { // TODO: TO TEST! // string logPath = GetDeviceLogPath(device, DateTime.Now); FileStream fs = File.Create(path); newHolder.FileStream = fs; streams[deviceName] = newHolder; return fs; } else { FileStream fs = File.Open(path, FileMode.Append); newHolder.FileStream = fs; streams[deviceName] = newHolder; return fs; } }