C# StackExchange.Redis事务

C# StackExchange.Redis事务,c#,asynchronous,stackexchange.redis,C#,Asynchronous,Stackexchange.redis,如何在一个事务中运行两个异步方法 例如: var batchIds = new ConcurrentBag<int>(); var trans = redis.CreateTransaction(); var task = trans.ListRangeAsync(AllItems, 0L, batchSize - 1).ContinueWith(t => { t?.Result.ToList().ForEach(x => batchIds.A

如何在一个事务中运行两个异步方法

例如:

  var batchIds = new ConcurrentBag<int>();
  var trans = redis.CreateTransaction();

  var task = trans.ListRangeAsync(AllItems, 0L, batchSize - 1).ContinueWith(t =>
   {
    t?.Result.ToList().ForEach(x => batchIds.Add(JsonConvert.DeserializeObject<StockItemDto>(x).Id));
     }).ContinueWith(t=>{ trans.ListTrimAsync(AllItems, batchSize, -1); });  // This not work

  // This work but I'm not sure if taskRemove run exaclly after task
  var taskRemove = trans.ListTrimAsync(AllItems, batchSize, -1);                    
  trans.Execute(CommandFlags.FireAndForget);
  Task.WaitAll(task, taskRemove);
var batchIds=new ConcurrentBag();
var trans=redis.CreateTransaction();
var task=trans.ListRangeAncy(AllItems,0L,batchSize-1)。ContinueWith(t=>
{
ForEach(x=>BatchId.Add(JsonConvert.DeserializeObject(x.Id));
}).ContinueWith(t=>{trans.ListTrimAsync(AllItems,batchSize,-1);});//这不管用
//这很有效,但我不确定taskRemove是否在task之后运行
var taskRemove=trans.ListTrimAsync(AllItems,batchSize,-1);
trans.Execute(CommandFlags.FireAndForget);
Task.WaitAll(任务,任务删除);
也许有人知道如何从列表中获取范围,然后在事务中删除该范围?

您不能这样做

解决方案是为读取操作创建常规
IDatabase
,为写入操作创建
ITransaction

为什么。。。?因为StackExchange.Redis事务是Redis的
MULTI
/
EXEC
命令的抽象。也就是说,事务是成批发送到Redis的命令队列,它们的执行是原子的。一旦调用
ITransaction.Execute
,整个批处理发送部分就会完成

这就是不能在Redis事务中执行读取操作的原因。命令排队并成批执行,因此,一旦bacthing结束,您可以继续执行任何命令,而这不会作为包装事务的一部分

OP在一些评论中说。。。
也许你能给我一些建议?因为我需要买东西 从列表和之后删除此项目。这些行动必须是 线程安全

线程安全与Redis事务毫无关系。作为应用程序层的一部分,您负责实现一些锁定方法。好的,您可以使用Redis作为进程间或多线程锁标志存储来实现该锁


事实上,检查一下其他问答:

也许你能给我一些建议?因为我需要从列表中获取项目,然后删除这些项目。这些操作必须是线程安全的。@PavloDenys我已经给了你一个建议。阅读我答案的第二段!:)这与线程安全无关,如果您想协调您的写操作,您的方法或“期望的方法”将不起作用。您需要实现一些锁定方法来阻止其他线程访问/修改应用层中的某些密钥…谢谢!“我将尝试实现这一点。”PavloDenys再次检查答案。我已经为您提供了另一个问答,我相信您可以轻松解决您的问题!;)