C# C代表、行动、职能??如何编写它来缩短代码
我想知道一个好主意,用Lambda+delegate+Func/Action重写我的类 在我的代码中,有很多锁包装器用于保存Sqlite模型C# C代表、行动、职能??如何编写它来缩短代码,c#,lambda,uwp,delegates,action,C#,Lambda,Uwp,Delegates,Action,我想知道一个好主意,用Lambda+delegate+Func/Action重写我的类 在我的代码中,有很多锁包装器用于保存Sqlite模型 using System.Threading; using System.Threading.Tasks; .... private SemaphoreSlim AsyncLock = new SemaphoreSlim(1); .... private async Task LockWork1(SqliteModel model)
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);}
我想制作一个使用lock的包装器方法。
这是我的照片
await LockWrapper( Work1( modelInstance ) );
Func,行动?怎么写呢?你不能像那样写,但你可以写:
await LockWrapper(() => Work1(modelInstance));
并将LockWrapper编写为:
其思想是,您传入的是您需要执行的操作—您调用该操作taskProvider,然后等待它完成,然后再解锁
这是不是一个好主意是另一回事——我不知道你的异步锁是什么,也不知道它是否假设WaitAsync和Release将在同一个线程上调用。如果假设是这样的话,如果在单线程同步上下文中调用LockWrapper,那么这段代码仍然可以,但我觉得它有点脆弱。我认为您将Func和Action作为与委托截然不同的东西。它们只是委托的特殊类型,它们包含在.NET基类库中,因此我们不必定义一些最常见的委托类型,如公共委托void Delstring消息;
private async Task LockWrapper(Func<Task> taskProvider)
{
await AsyncLock.WaitAsync();
try
{
await taskProvider();
}
finally
{
AsyncLock.Release();
}
}