Почему выполняются операторы после цикла while? - PullRequest
0 голосов
/ 05 июля 2019

Я работаю с хранилищем Azure.Перемещение файла во вторичное хранилище, как только оно становится доступным в первичном хранилище, и файл обычно доступен через 3-5 секунд.Я вижу, что он был перемещен во вторичное хранилище, но цикл while продолжал выполняться до тех пор, пока он не был уничтожен во время ночного развертывания после выполнения 7000 раз.

public async Task<File> ProcessArchive()
{
    CloudBlockBlob sourceBlob = sourceContainer
                        .GetBlockBlobReference(video);


    bool exists = sourceBlob.Exists();


    while (!exists)
    {
        await _logServices.Log(
            "Condition Triggered",
            "ProcessArchive",
            new
            {
                ArchiveId = archiveId
            });
        Thread.Sleep(2000);
        exists = sourceBlob.Exists();
    }

    Console.WriteLine("Moving operation code!");

}

Разве это не значит ждать цикла whileвозвращает false и затем выполняет последнюю строку?

Обновление: хотя цикл все еще прерывается, теперь единственное отличие состоит в том, что его убивают через 2 минуты после обновления кода.

            CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(video);

            bool exists = await sourceBlob.ExistsAsync();

            // Emergency bail-out
            CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMinutes(2));

            while (!exists)
            {
                await _logServices.Log(
                    LogCategory.Audit,
                    "Condition Triggered",
                    "ProcessArchive",
                    new
                    {
                        ArchiveId = archiveId
                    });
                await Task.Delay(2000);
                sourceBlob = sourceContainer
                    .GetBlockBlobReference(video);
                exists = await sourceBlob.ExistsAsync();
                if (source.IsCancellationRequested) break;
            }

            Console.WriteLine("Rest of the code which is another 50 lines.");

Обновление: Jeez!У нас есть пользователи, пытающиеся переместить уже перемещенный файл!

1 Ответ

0 голосов
/ 05 июля 2019

Ваш метод асинхронный . Я вижу, что вы используете Thread.Sleep () , поэтому я думаю, у вас есть несколько потоков, вызывающих этот метод ?? Но причина, по которой вы должны использовать async, заключается в уменьшении количества потоков в вашем приложении.

Попробуйте использовать следующее:

await Task.Delay(2000); 

Это Thread.Sleep() для асинхронных методов. Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...