2017-09-30 165 views
0

我想知道一个好主意,用Lambda + delegate + Func/Action重写我的类。C#委托,动作,函数?如何编写代码以使代码更短

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

Func,Action()?如何写它?

+0

我觉得你把'Func'和'Action'与代表完全不同。它们只是'delegate'的特殊类型,它们被包含在.NET Base Class Library中,因此我们不必定义一些最常见的委托类型,例如'public delegate void Del(string message); ' – kennyzx

回答

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在单线程同步上下文中被调用,但它感觉有点脆弱。