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 是什么,或者它是否假设 WaitAsyncRelease 会是在同一线程上调用。如果它假设,这段代码仍然可以 if LockWrapper 是在单线程同步上下文中调用的,但我觉得它有点脆弱。