C# 委托、动作、函数 ??如何编写它以缩短代码
C# Delegate,Action,Func ?? How to write it to make shorter code
我想知道用 Lambda + 委托 + Func/Action 重写我的 class 的好主意。
在我的代码中,有很多 Lock 包装器(用于保存 Sqlite 模型)。
using System.Threading;
using System.Threading.Tasks;
....
private SemaphoreSlim AsyncLock = new SemaphoreSlim(1);
....
private async Task LockWork1(SqliteModel model)
{
await AsyncLock.WaitAsync();
try { await Work1(model); }
finally { AsyncLock.Release(); }
}
private async Task LockWork2(SqliteModel model)
{
await AsyncLock.WaitAsync();
try{await Work2(model);}
finally{AsyncLock.Release();}
}
private async Task Work1(SqliteModel model){var a=model; await Task.Delay(1000);}
private async Task Work2(SqliteModel model){var a=model; await Task.Delay(2000);}
我想制作一个 Wrapper 方法来使用锁。
这是我的图片。
await LockWrapper( Work1( modelInstance ) );
功能,动作()?怎么写??
好吧,你无法做到 完全,但你可以这样写:
await LockWrapper(() => Work1(modelInstance));
并将LockWrapper
写为:
private async Task LockWrapper(Func<Task> taskProvider)
{
await AsyncLock.WaitAsync();
try
{
await taskProvider();
}
finally
{
AsyncLock.Release();
}
}
想法是您传入的是 "the operation you need to perform" - 您调用该操作 (taskProvider()
) 然后等待它完成再解锁。
这是否是个好主意是另一回事 - 我不知道你的 AsyncLock
是什么,或者它是否假设 WaitAsync
和 Release
会是在同一线程上调用。如果它假设,这段代码仍然可以 if LockWrapper
是在单线程同步上下文中调用的,但我觉得它有点脆弱。
我想知道用 Lambda + 委托 + Func/Action 重写我的 class 的好主意。
在我的代码中,有很多 Lock 包装器(用于保存 Sqlite 模型)。
using System.Threading;
using System.Threading.Tasks;
....
private SemaphoreSlim AsyncLock = new SemaphoreSlim(1);
....
private async Task LockWork1(SqliteModel model)
{
await AsyncLock.WaitAsync();
try { await Work1(model); }
finally { AsyncLock.Release(); }
}
private async Task LockWork2(SqliteModel model)
{
await AsyncLock.WaitAsync();
try{await Work2(model);}
finally{AsyncLock.Release();}
}
private async Task Work1(SqliteModel model){var a=model; await Task.Delay(1000);}
private async Task Work2(SqliteModel model){var a=model; await Task.Delay(2000);}
我想制作一个 Wrapper 方法来使用锁。 这是我的图片。
await LockWrapper( Work1( modelInstance ) );
功能,动作()?怎么写??
好吧,你无法做到 完全,但你可以这样写:
await LockWrapper(() => Work1(modelInstance));
并将LockWrapper
写为:
private async Task LockWrapper(Func<Task> taskProvider)
{
await AsyncLock.WaitAsync();
try
{
await taskProvider();
}
finally
{
AsyncLock.Release();
}
}
想法是您传入的是 "the operation you need to perform" - 您调用该操作 (taskProvider()
) 然后等待它完成再解锁。
这是否是个好主意是另一回事 - 我不知道你的 AsyncLock
是什么,或者它是否假设 WaitAsync
和 Release
会是在同一线程上调用。如果它假设,这段代码仍然可以 if LockWrapper
是在单线程同步上下文中调用的,但我觉得它有点脆弱。