2017-10-18 3 views
2

den folgenden Code Gegeben:Ist Wait() auf einem ManualResetEventSlim garantiert, um eine Annullierung zu bewirken?

mre.Wait(cts.Token); 

cts.Cancel(); 
mre.Set(); 

ist die erste (Anruf zu mre.Wait(cts.Token)) garantiert eine OperationCanceledException werfen:

CancellationTokenSource cts = new CancellationTokenSource(); 
ManualResetEventSlim mre = new ManualResetEventSlim(); 

und diese beiden gleichzeitig Threads ausführt oder ist es auch möglich, dass es nur zurück?

Mein Darm sagt, ich sollte erwarten, dass entweder (interne Race Condition) passieren. MSDN gibt keine Antwort, es sagt nur "während der Beobachtung des CancellationToken".

Ich hoffe auf eine Antwort mit spezifischen Details, wie und warum.

Ich würde gerne Kommentare wie "Cancel() und Set() erwarten, um gleichzeitig auftreten/in beliebiger Reihenfolge und damit beide Fälle, sowieso". Ich bin mir dessen voll bewusst.

Antwort

1

Es gibt Race-Bedingung, weil Waitimplemented wie das ist:

public bool Wait(int millisecondsTimeout, CancellationToken cancellationToken) 
{ 
    ThrowIfDisposed(); 
    cancellationToken.ThrowIfCancellationRequested(); // an early convenience check 

    if (millisecondsTimeout < -1) 
    { 
     throw new ArgumentOutOfRangeException("millisecondsTimeout"); 
    } 

    if (!IsSet) 
    { 
    // lots of stuff here, not relevant 
    } 
    return true; 
} 

zweiter Thread (die beide aufhebt und setzen das Token) könnten ersten Thread unterbrechen direkt zwischen cancellationToken.ThrowIfCancellationRequested() Prüfung und IsSet überprüfen.

Verwandte Themen