C# Lock and Async Method
In the code below, will the line block the thread?
Technically, yes, but it won't work as you expect.
There are two reasons why thread-affine locks don't play well with async
. One is that (in the general case), an async
method may not resume on the same thread, so it would try to release a lock it doesn't own while the other thread holds the lock forever. The other reason is that during an await
while holding a lock, arbitrary code may execute while the lock is held.
For this reason, the compiler goes out of its way to disallow await
expressions within lock
blocks. You can still shoot yourself in the foot by using Monitor
or other primitives directly, though.
If it blocks the thread (which is what I think), is there an standard not blocking solution?
Yes; the SemaphoreSlim
type supports WaitAsync
.
This has been disallowed to stop deadlocks (i.e. developers hurting themselves). The best solution I've found is to use semaphores - See this post for details.
Relevant code extract:
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1);
...
await semaphoreSlim.WaitAsync();
try
{
await Task.Delay(1000);
}
finally
{
semaphoreSlim.Release();
}
No it won't.
lock
is syntactic sugar for Monitor.Enter
and Monitor.Exit
. lock
will keep execution in the method until the lock is released. It does not function like await
in any way, shape or form.