C# 多个线程同时更新AZURE表中同一行的不同列
我有一个要求,我必须更新azure表中同一行的不同列,该表由多个线程同时访问(所有线程都查询同一行),而不覆盖其他线程将更新的内容。 示例代码:C# 多个线程同时更新AZURE表中同一行的不同列,c#,concurrency,azure-table-storage,azure-tablequery,C#,Concurrency,Azure Table Storage,Azure Tablequery,我有一个要求,我必须更新azure表中同一行的不同列,该表由多个线程同时访问(所有线程都查询同一行),而不覆盖其他线程将更新的内容。 示例代码: public void doSomething(){ 列表记录=新列表(); 对于(var j=0;j{ UpdateTable(“Col2”,记录[i]);}); tasks.Add(Task.Run)(()=>{ UpdateTable(“Col3”,记录[i]);}); tasks.Add(Task.Run)(()=>{ UpdateTable
public void doSomething(){
列表记录=新列表();
对于(var j=0;j<12;j++)
{
InsertRecords(j);//向表中插入数据并创建变量ID=PartitionKey+rowkey
records.Add(id);//它有所有12个分区键和行键组合
}
对于(变量i=0;i<12;i+=4)
{
列表任务=新列表();
tasks.Add(Task.Run)(()=>{
UpdateTable(“COl1”,记录[i];}));//应更新COl1以完成
tasks.Add(Task.Run)(()=>{
UpdateTable(“Col2”,记录[i]);});
tasks.Add(Task.Run)(()=>{
UpdateTable(“Col3”,记录[i]);});
tasks.Add(Task.Run)(()=>{
UpdateTable(“Col4”,记录[i]);});
Task.WaitAll(tasks.ToArray());
}
}
公共void UpdateTable(字符串消息){
ITableEntity=myRepo.retrieveEntity(myPartitionKey,myRowKey);
如果(消息==“COL1”){
//更新Col1以完成
(myClass)实体)。Col=“完成”;
}
如果(消息==“COL2”){
//更新Col2以完成
(myClass)实体)。Col2=“完成”;
}
如果(消息==“COL3”){
//更新Col3以完成
(myClass)实体)。Col3=“完成”;
}
TableOperation tableOp=TableOperation.InsertOrReplace(实体);
//var mergeOperation=TableOperation.Merge(entity);也尝试了此操作,但没有成功
//执行(合并操作);
CloudStorageAccount-storageAccount=CloudStorageAccount.Parse(“ConnString”);
CloudTableClient tableClient=storageAccount.CreateCloudTableClient();
myTable=tableClient.GetTableReference(“myTable”);
myTable.CreateIfNotExists();
myTable.Execute(tableOp);//似乎不起作用[覆盖]
}
预期输出:COl1、Col2、Col3的状态应为“完成”。如何实现这一点?您可以利用TableOperation.InsertOrMerge来实现这一点:@ZhaoxingLu Microsoft非常感谢,但上述解决方案适用于无线程的单次执行。在并行线程中执行412 percondition时出现异常失败。@ZhaoxingLu Microsoft它成功了。每次合并我都必须创建diff实体。非常感谢:)太好了!你能把你的解决方案发布给其他人参考吗?
public void doSomething(){
List<string> records= new List<string>();
for (var j = 0; j < 12; j++)
{
InsertRecords(j);//Inserts data to the table and Creates a variable Ids=PartitionKey+rowkey
records.Add(Ids);//It has all 12 partitionKeys and RowKeys combinations
}
for (var i = 0; i < 12;i+=4)
{
List<Task> tasks = new List<Task>();
tasks.Add(Task.Run(() => {
UpdateTable("COl1",records[i]); }));//should update col1 to complete
tasks.Add(Task.Run(() => {
UpdateTable("Col2",records[i]); }));
tasks.Add(Task.Run(() => {
UpdateTable("Col3",records[i]); }));
tasks.Add(Task.Run(() => {
UpdateTable("Col4",records[i]); }));
Task.WaitAll(tasks.ToArray());
}
}
public void UpdateTable(String message){
ITableEntity entity = myRepo.retrieveEntity(myPartitionKey, myRowKey);
If (message=="COL1"){
//Update Col1 to Complete
(myClass)entity).Col= "Complete";
}
If (message=="COL2"){
//Update Col2 to Complete
(myClass)entity).Col2= "Complete";
}
If (message=="COL3"){
//Update Col3 to Complete
(myClass)entity).Col3= "Complete";
}
TableOperation tableOp=TableOperation.InsertOrReplace(entity);
//var mergeOperation = TableOperation.Merge(entity); tried this also but didnt work
// myTable.Execute(mergeOperation);
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("ConnString");
CloudTableClient tableClient=storageAccount.CreateCloudTableClient();
myTable = tableClient.GetTableReference("MyTable");
myTable.CreateIfNotExists();
myTable.Execute(tableOp);//doesn't seem to work[overwrites]
}