Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C代表、行动、职能??如何编写它来缩短代码_C#_Lambda_Uwp_Delegates_Action - Fatal编程技术网

C# C代表、行动、职能??如何编写它来缩短代码

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)

我想知道一个好主意,用Lambda+delegate+Func/Action重写我的类

在我的代码中,有很多锁包装器用于保存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);}
我想制作一个使用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();
    }
}