【问题标题】:C# Delegate,Action,Func ?? How to write it to make shorter codeC# 委托、动作、函数 ??如何编写它以使代码更短
【发布时间】:2017-09-30 08:50:07
【问题描述】:

我想知道一个用 Lambda + 委托 + Func/Action 重写我的类的好主意。

在我的代码中,有很多 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 ) );

函数,动作()?怎么写??

【问题讨论】:

  • 我认为您将FuncAction 视为与委托截然不同的东西。它们只是 delegate 的特殊类型,它们包含在 .NET 基类库中,因此我们不必像 public delegate void Del(string message); 那样定义一些最常见的委托类型

标签: c# lambda uwp delegates action


【解决方案1】:

嗯,你将无法做到相当那样,但你可以写:

await LockWrapper(() => Work1(modelInstance));

并将LockWrapper 写为:

private async Task LockWrapper(Func<Task> taskProvider)
{
    await AsyncLock.WaitAsync();
    try
    {
        await taskProvider();
    }
    finally
    { 
        AsyncLock.Release();
    }
}

这个想法是,您传入的是“您需要执行的操作”——您调用该操作 (taskProvider()),然后等待它完成后再解锁。

这是否是一个好主意是另一回事 - 我不知道您的 AsyncLock 是什么,或者它是否假设 WaitAsyncRelease 将在同一个线程上被调用。如果假设是这样,这段代码仍然可以正常运行如果LockWrapper 在单线程同步上下文中被调用,但我觉得它有点脆弱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2016-02-16
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多