Azure service fabric IReliableDictionary TryGetValueAsync()引发异常;该键已存在于字典中;

Azure service fabric IReliableDictionary TryGetValueAsync()引发异常;该键已存在于字典中;,azure-service-fabric,Azure Service Fabric,我正在尝试更新可靠字典中存储的数据项,如下所示: private async Task UpdateDictionary(IEnumerable<long> keys) { var dataDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary2<long, DataItem>>("DataItemsDictionary"); using (var tx =

我正在尝试更新可靠字典中存储的数据项,如下所示:

private async Task UpdateDictionary(IEnumerable<long> keys)
{
    var dataDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary2<long, DataItem>>("DataItemsDictionary");
    using (var tx = this.stateManager.CreateTransaction())
    {
        // When I replace parallel with foreach, it works fine.
        keys.AsParallel().ForAll(async k =>
        {
            // Below line is line 54 in the exception
            var dataItem = await dataDictionary.TryGetValueAsync(tx, k);
            if (dataItem.HasValue)
            {
                ServiceEventSource.Current.Message(dataItem.Value.ToString());

                var newItem = new DataItem(dataItem.Value);
                newItem.TransmissionState = TransmissionState.InReview;
                await dataDictionary.SetAsync(tx, newItem.Id, newItem);
            }
        });

        await tx.CommitAsync();
    }
}

System.ArgumentException occurred
  HResult=0x80070057
  Message=The key already existed in the dictionary.
  Source=mscorlib
  StackTrace:
   at System.Collections.Concurrent.ConcurrentDictionary`2.System.Collections.Generic.IDictionary<TKey,TValue>.Add(TKey key, TValue value)
   at System.Fabric.Store.TStore`5.CreateStoreReadWriteTransaction(Transaction replicatorTransaction)
   at System.Fabric.Store.TStore`5.CreateOrFindTransaction(Transaction replicatorTransaction)
   at Microsoft.ServiceFabric.Data.Collections.DistributedDictionary`2.<TryGetValueAsync>d__117.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at StateService.StateManager.DataItemTask.<>c__DisplayClass2_1.<<UpdateDictionary>b__0>d.MoveNext() in D:\SFApplication\StateManager\Tasks\DataItemTask.cs:line 54
private async Task UpdateDictionary(IEnumerable键)
{
var dataDictionary=wait this.stateManager.GetOrAddAsync(“DataItemsDictionary”);
使用(var tx=this.stateManager.CreateTransaction())
{
//当我用foreach替换parallel时,它工作得很好。
keys.AsParallel().ForAll(异步k=>
{
//第行下面是例外情况中的第54行
var dataItem=await dataDictionary.TryGetValueAsync(tx,k);
if(dataItem.HasValue)
{
ServiceEventSource.Current.Message(dataItem.Value.ToString());
var newItem=新数据项(DataItem.Value);
newItem.TransmissionState=查看中的TransmissionState.InReview;
wait dataDictionary.SetAsync(tx,newItem.Id,newItem);
}
});
wait tx.CommitAsync();
}
}
发生System.ArgumentException异常
HResult=0x80070057
Message=字典中已存在密钥。
Source=mscorlib
堆栈跟踪:
位于System.Collections.Concurrent.ConcurrentDictionary`2.System.Collections.Generic.IDictionary.Add(TKey、TValue)
位于System.Fabric.Store.TStore`5.CreateStoreReadWriteTransaction(事务复制Transaction)
在System.Fabric.Store.TStore`5.CreateOrFindTransaction(事务复制Transaction)
在Microsoft.ServiceFabric.Data.Collections.DistributedDictionary`2.d_u117.MoveNext()中
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在d:\SFApplication\StateManager\Tasks\DataItemTask.cs中的StateService.StateManager.DataItemTask.c\uuu显示class2\u 1.d.MoveNext():第54行
我不明白为什么TryGetValueAsync函数试图添加到字典中。理想情况下,它应该只获取元素


奇怪的是,当我删除并行查询并用foreach替换它时,它工作得很好。在事务中使用并行是否不安全?

事务无法处理对同一事务的并行请求。文档页面中描述了以下内容:

事务是并发的单位。用户可以有多个 在任何给定时间点进行的事务,但对于给定时间点 事务每次必须调用一个API。 调用采用Microsoft.ServiceFabric.Data.ITransaction的任何异步可靠收集方法时,必须 在调用之前,请等待返回的任务完成 使用相同事务的另一个方法

Parallel不起作用,foreach也起作用,因为在使用同一事务调用另一个方法之前,必须等待返回任务的完成