Beispiel #1
0
        private async Task WriteToStorageAsync()
        {
            if (Interlocked.CompareExchange(ref _writeLockInt, 1, 0) != 0)
            {
                try
                {
                    bool isFirstLoop = true;

                    while ((isFirstLoop && _queue.Count > 0) ||
                           _queue.Count > MAX_QUEUE_LENGTH)
                    {
                        var    stream = new MemoryStream();
                        object?telemetry;

                        while (stream.Length < MAX_BUFFER_SIZE &&
                               _queue.TryDequeue(out telemetry))
                        {
                            if (telemetry == null)
                            {
                                throw new NullReferenceException("Logged telemetry can't be null");
                            }
                            await JsonSerializer.SerializeAsync(stream, telemetry, _serializerOptions);

                            stream.WriteByte((byte)'\n');
                        }
                        stream.Position = 0;
                        if (_blobName == null)
                        {
                            _blobName = CreateBlobName();
                            await _storageFacade.CreateAppendBlobAsync(_blobName);
                        }
                        await _storageFacade.AppendBlobAsync(_blobName, stream);

                        ++_blocks;
                        if (_blocks == MAX_BLOCKS)
                        {
                            _blobName = null;
                        }
                        isFirstLoop = false;
                    }
                }
                finally
                {
                    _writeLockInt = 0;
                }
            }
        }