gpt4 book ai didi

c# - 不允许异步锁

转载 作者:可可西里 更新时间:2023-11-01 03:12:12 27 4
gpt4 key购买 nike

基本上,我想向 tcp 服务器发出多个异步请求。我目前有一个工作客户端,它只同步并在每次网络调用时阻止 UI。由于几乎同时发生多个请求,我尝试这样做:

private object readonly readLock = new object(); 
public async Task UpdateDetailsAsync()
{
//I want every request to wait their turn before requesting (using the connection)
//to prevent a read call from catching any data from another request
lock (readLock)
{
Details details = await connection.GetDetailsAsync();
detailsListBox.Items = details;
}
}

我确信这不是 lock 的好用法,但这是我能想到的唯一可以让调用等待轮到它们的方法。有没有我可以用来实现这种行为的对象?我认为 Monitor 会是一样的,所以我没有尝试(我知道它们是多线程的东西,但这就是我所熟悉的......)

最佳答案

看起来你遇到的问题是线程在获取锁时会阻塞,所以你的方法不是完全异步的。要解决此问题,您可以使用 SemaphoreSlim.WaitAsync

private readonly SemaphoreSlim readLock = new SemaphoreSlim(1, 1); 
public async Task UpdateDetailsAsync()
{
//I want every request to wait their turn before requesting (using the connection)
//to prevent a read call from catching any data from another request
await readLock.WaitAsync();
try
{
Details details = await connection.GetDetailsAsync();
detailsListBox.Items = details;
}
finally
{
readLock.Release();
}
}

关于c# - 不允许异步锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32084943/

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