为什么在while循环后执行语句?

时间:2019-07-05 12:55:36

标签: c# azure while-loop

我正在使用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 :(得分:-3)

您的方法是异步。我看到您正在使用 Thread.Sleep(),所以我想您有多个调用此方法的线程?但是,您应该使用async的原因是为了减少应用程序中的线程数量。

尝试使用以下内容:

await Task.Delay(2000); 

这是异步方法的Thread.Sleep()。 希望对您有帮助!