gpt4 book ai didi

c# - .Net Core Async 关键部分(如果在同一实体上工作)

转载 作者:行者123 更新时间:2023-11-30 22:54:28 31 4
gpt4 key购买 nike

我需要确保通过 web API 访问的方法不能同时被多个调用访问,如果它在具有相同 id 的同一个对象上工作的话

我理解 SemaphoreSlim 的用法,但是一个简单的实现会锁定所有的临界区。但只有当它适用于同一个实体而不适用于 2 个不同的实体时,我才需要锁定该部分

这是我的场景,一个用户开始工作,创建实体并准备修改,然后一个或多个用户可以操作这个实体,但是这个操作的一部分必须在关键部分或者它将导致数据不一致,当工作完成后,实体将从工作状态中移除并移动到存档中,并且只能以只读方式访问

包含该函数的类在应用程序启动时作为 transient 注入(inject)

 services.AddTransient<IWorkerService>(f => new WorkerService(connectionString));
public async Task<int> DoStuff(int entityId)
{
//Not Critical Stuff

//Critical Stuff

ReadObjectFromRedis();
ManipulateObject();
UpdateSqlDatabase();
SaveObjectToRedis();

//Not Critical Stuff
}

我怎样才能做到这一点?

最佳答案

试试这个,我不确定这些对象是否在 .net-core 中可用

class Controller
{
private static ConcurrentDictionary<int, SemaphoreSlim> semaphores = new ConcurrentDictionary<int, SemaphoreSlim>();

public async Task<int> DoStuff(int entityId)
{
SemaphoreSlim sem = semaphores.GetOrAdd(entityId, ent => new SemaphoreSlim(0, 1));
await sem.WaitAsync();
try
{
//do real stuff
}
finally
{
sem.Release();
}
}
}

关于c# - .Net Core Async 关键部分(如果在同一实体上工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56236196/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com