Neil が言及したように、テーブル サービスに同時実行関連のものを処理させることをお勧めします。
クライアント ライブラリを使用してテーブル サービスからエンティティを取得すると、ライブラリは、エンティティに関連付けられた ETag (エンティティに対するサービスからの応答に存在する) を EntityDescriptior インスタンスに格納します (EntityDescriptor は、ライブラリによって維持されるオブジェクトです)。コンテキスト内の各エンティティ インスタンス)
エンティティを更新するリクエストを送信すると、sdk は、HTTP リクエストの本文を XML にシリアル化されたエンティティとして、リクエストの ETag ヘッダーをエンティティに対応するエンティティ記述子に格納された ETag 値として準備します。
テーブル サービスは、エンティティ インスタンスを更新するためのこの要求を受信すると、要求内の ETag が、テーブル ストレージ内のエンティティに現在関連付けられている ETag と一致するかどうかを確認します (サービスに格納されているエンティティに関連付けられている ETag は、他の更新が発生した場合に変更されます)。更新リクエストを受信する前に)、一致しない場合、サービスは、応答で HTTP ステータス コードを 412 または 409 に設定することにより、前提条件の失敗/競合エラーを返します。
bool done = true;
while (!done)
{
Stat statistics = _context.Execute<Stat>(new Uri("https://management.core.windows.net/<subscription-id>/services/storageservices/StatEntity?RowKey=..&PartitionKey=..").FirstOrDefault();
try
{
// TODO: Update the entity, e.g. statistics.ReadCount++
_context.UpdateObject(statistics);
_context.SaveChanges();
// success
break;
}
catch (DataServiceRequestException exception)
{
var response = exception.Response.FirstOrDefault();
if (response != null && (response.StatusCode == 412 || response.StatusCode == 409))
{
// Concurrency Exception - Entity Updated in-between
// by another thread, Fetch the latest _stat entity and repeat operation
}
else
{
// log it and come out of while loop
break;
}
}
catch (Exception)
{
// log it and come out of while loop
break;
}
}