Open BalassaMarton opened 1 year ago
Could the System.Threading.Tasks.Extensions
nuget package be used to support older framworks.
Could the
System.Threading.Tasks.Extensions
nuget package be used to support older framworks.
Yes, it should be possible to use ValueTask from System.Threading.Tasks.Extensions to support older frameworks.
Pretty late to the discussion, but this PR as a whole would be pretty interesting to expand on.
Created a new experimental async lock implementation that supports fast, zero-alloc reentrancy: https://github.com/BalassaMarton/AsyncExtensions I'd be happy to see your feedback, especially from @StephenCleary
@timcassell look at this example: https://github.com/BalassaMarton/AsyncExtensions?tab=readme-ov-file#example-recursive-async-locking-using-a-token The specific problem I was trying to solve: I had a bunch of short, specific methods that needed exclusive access to resources, but it was hard to follow which methods were doing the actual locking vs assuming the lock being already taken. With this approach, the method parameter effectively documents that it will asynchronously lock on the resource if it's not locked already:
async ValueTask OuterMethod(AsyncLockToken token = default)
{
using (token = await mutex.LockAsync(token))
{
await InnerMethod(token);
}
}
async ValueTask InnerMethod(AsyncLockToken token = default)
{
using (await mutex.LockAsync(token))
{
// ...
}
}
I even had a variation where you could name your AsyncLock
objects and annotate any method that will lock on them like [LocksOn("lockName")]
- and LockAsync
would validate that methods in the current call stack are correctly annotated. This is of course all experimental, I'm not saying any of this is the way to do async locking.
Methods returning
AwaitableDisposable
could returnValueTask
instead.Pros
Cons
ValueTask
.I'll submit an experimental PR just for the sake of discussion.