2017-09-30 10 views
0

Je veux savoir une bonne idée de réécrire ma classe avec Lambda + delegate + Func/Action.C# Délégué, Action, Func ?? Comment l'écrire pour faire du code plus court

Dans mon code, il y a beaucoup de wrapper Lock (pour sauvegarder un modèle 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);} 

Je souhaite créer une méthode Wrapper pour utiliser le verrouillage. Voici mon image.

await LockWrapper(Work1(modelInstance)); 

Func, Action()? Comment l'écrire ??

+0

Je pense que vous prenez 'Func' et' Action' comme quelque chose de radicalement différent de délégué. Ils ne sont que des types spéciaux de 'delegate', ils sont inclus dans la bibliothèque de classes .NET Base. Nous n'avons donc pas besoin de définir certains des types de délégués les plus courants comme' public delegate void Del (message de chaîne); ' – kennyzx

Répondre

1

Eh bien, vous ne serez pas en mesure de le faire tout à fait comme ça, mais vous pouvez écrire:

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

et écrire LockWrapper comme:

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

L'idée est que ce que vous La transmission est "l'opération à effectuer" - vous appelez cette opération (taskProvider()), puis attendez qu'elle soit terminée avant de la déverrouiller. Que ce soit une bonne idée ou non, c'est une question différente - je ne sais pas ce que votre AsyncLock est, ou si elle suppose que WaitAsync et Release seront appelés sur le même sujet. Si cela suppose que, ce code pourrait encore être correct siLockWrapper est appelée dans un contexte de synchronisation à un seul thread, mais cela me semble un peu fragile.