看起来您的问题是线程在获取锁时将阻塞,因此您的方法并不完全异步。为了解决这个问题,您可以使用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(); }}


