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);
            }
        }
Example #3
0
    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));
    }
Example #4
0
        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;
            }
        }