Mic*_*bin 1 c# azure azure-storage-blobs
我有一些C#代码将Blob从一个存储帐户复制到另一个。我注意到,当我调用时CloudBlob.StartCopyAsync,目标Blob的CopyState.Status设置为CopyStatus.Pending。有什么方法可以使我获得复制操作的更新状态?
我曾尝试await Task.Delay(TimeSpan.FromSeconds(10));在通话后添加a ,但延迟结束后,状态仍显示为待定。如果然后尝试从存储容器中重新获取Blob,则会得到CopyStatus == null。
轮询复制Blob属性:现在,我们提供了以下附加属性,这些属性允许用户使用Get Blob Properties,Get Blob或List Blobs跟踪复制的进度:
x-ms-copy-status(或CopyStatus):复制操作的当前状态。可以是以下之一:挂起:复制操作处于挂起状态。成功:复制操作成功完成。已中止:客户端中止了复制操作。失败:由于错误,复制操作无法完成。
x-ms-copy-id(CopyId):复制操作返回的ID,可用于监视进度或中止复制。
x-ms-copy-status-description(CopyStatusDescription):可用于诊断的其他错误信息。
x-ms-copy-progress(CopyProgress):到目前为止已复制的Blob数量。它具有X / Y格式,其中X =复制的字节数,Y是字节总数。
x-ms-copy-completion-time(CopyCompletionTime):最后一个副本的完成时间。
可以监视这些属性以跟踪返回“待处理”状态的复制操作的进度。但是,需要注意的是,除了“放置页面”,“放置块”和“租赁Blob”操作之外,目标Blob上的任何其他写入操作(即“放置Blob”,“放置块列表”,“设置Blob元数据”,“设置Blob属性”)都将删除这些属性。关于复制操作。
请注意,您需要定期从Azure存储服务器端轮询复制状态,await Task.Delay(TimeSpan.FromSeconds(10));实际上不执行任何操作。
public static void MonitorCopy(CloudBlobContainer destContainer)
{
bool pendingCopy = true;
while (pendingCopy)
{
pendingCopy = false;
var destBlobList = destContainer.ListBlobs(
true, BlobListingDetails.Copy);
foreach (var dest in destBlobList)
{
var destBlob = dest as CloudBlob;
if (destBlob.CopyState.Status == CopyStatus.Aborted ||
destBlob.CopyState.Status == CopyStatus.Failed)
{
// Log the copy status description for diagnostics
// and restart copy
Log(destBlob.CopyState);
pendingCopy = true;
destBlob.StartCopyFromBlob(destBlob.CopyState.Source);
}
else if (destBlob.CopyState.Status == CopyStatus.Pending)
{
// We need to continue waiting for this pending copy
// However, let us log copy state for diagnostics
Log(destBlob.CopyState);
pendingCopy = true;
}
// else we completed this pending copy
}
Thread.Sleep(waitTime);
};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2480 次 |
| 最近记录: |