2013-07-23 7 views
10

Ich komme aus C++ - Welt, also bin ich sehr daran gewöhnt, Threads und Mutex-Guarding zu sperren. Unter der Annahme, diese grundlegende Funktion:C# async/await - Anzahl der Aufrufe von asynchronen Methoden beschränken/sperren

async Task BasicProcess() { 
    // await time consuming task 
} 

Wie kann ich diese Funktion sperren, damit nur ein BasicProcess können gleichzeitig laufen?

Dies ist, was ich erreichen will:

async Task BasicProcess() { 
    lock (BasicProcessLock) { 
     // await time consuming task 
    } 
} 
+5

Siehe http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988 .aspx für eine AsyncLock-Implementierung. –

Antwort

29

Sie können SemaphoreSlim verwenden (1) für diese, A SemaphoreSlim erstellt mit (1) wird sicher nur ein Thread machen kann die Sperre, alle anderen Themen erhalten dass versuchen, das Schloss zu bekommen - wird warten, bis derjenige, der es bekommen hat - es freigeben.
ein eigenes Mitglied erstellen:

private SemaphoreSlim _syncLock = new SemaphoreSlim(1); 

Dann im Code tun:

async Task BasicProcess() { 

    await _syncLock.WaitAsync(); //Only 1 thread can access the function or functions that use this lock, others trying to access - will wait until the first one released. 
    //Do your stuff.. 
    _syncLock.Release(); 

} 
+2

Nur dass dies jetzt den aufrufenden Thread blockiert, was nicht ideal ist, wenn es wirklich asynchron sein soll. –

+0

Besser verwenden "erwarten _syncLock.WaitAsync();" - Andernfalls wird der Thread blockiert und die Aufgabe wird nicht ausgeführt. – jlahd

+0

Jon/jlahd - Danke dafür, aktualisiert, um nicht zu blockieren. – ilansch

Verwandte Themen