Как мне правильно обрабатывать сообщение «Количество зафиксированных блоков не может превышать максимальный предел в 50 000 блоков». Исключение при выполнении CloudAppendBlob.AppendTextAsync?
В настоящее время у меня есть следующий код:
private async Task MessageLogger()
{
string messages = "";
while (true)
{
// Check if a new log file should be created
if (DateTime.UtcNow.Day != _logCreatedUtc.Day)
{
// Create a new log file
await CreateNewLogAsync();
}
if (_messageQueue.Count == 0 && messages.Length == 0)
{
await Task.Delay(50);
continue;
}
int n = 0;
while ((this._messageQueue.Count > 0) && (n < 50))
{
string message;
if (this._messageQueue.TryPeek(out message))
{
messages += message;
this._messageQueue.TryDequeue(out message);
n++;
}
}
try
{
// Append messages to Azure Blob
await _appendBlob.AppendTextAsync(messages);
messages = "";
}
catch (Microsoft.WindowsAzure.Storage.StorageException exception)
when(exception.RequestInformation.HttpStatusCode == 404)
{
// Log file was deleted. Create a new log file
await CreateNewLogAsync();
}
catch (Exception exception)
{
LogException("Exception from CloudAppendBlob.AppendTextAsync", exception);
await Task.Delay(1000);
}
}
}
Время от времени я получаю следующее исключение, зарегистрированное в результате общего обработчика исключений в моем коде:
01.04.2018 22:17:03.030 - <<EXCEPTION>>: Exception from CloudAppendBlob.AppendTextAsync
01.04.2018 22:17:03.044 - <<EXCEPTION>>: Type =<System.AggregateException> Message =<One or more errors occurred. (One or more errors occurred. (The committed block count cannot exceed the maximum limit of 50,000 blocks.))> InnerException.Message=<One or more errors occurred. (The committed block count cannot exceed the maximum limit of 50,000 blocks.)>
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.<Dispose>b__8_0()
at Microsoft.WindowsAzure.Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext(Action actionToRun)
at Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at System.IO.Stream.Dispose()
at Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.<UploadFromStreamAsyncHelper>d__34.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Infrastructure.Logging.AzureBlob.Logger.<MessageLogger>d__24.MoveNext() in /opt/vsts/work/1/s/Infrastructure/Logging/Infrastructure.Logging.AzureBlob/Logger.cs:line 183
Как выглядит обработчик исключений, чтобы поймать именно такую ошибку? Я хотел бы добавить для него специальный обработчик.
Я попытался посмотреть в отладчике, но это выглядит очень странно:
Переменная исключения выглядит в отладчике как «нулевая», но на самом деле это не так, и она регистрируется нормально.