2017-11-07 4 views
-1

ich eine Operation über While, dass ich einfrieren wollen:Während mit Manual

do 
    { 
     ManualResetEvent.Reset(); // Here i want to wait 

     // Here i am doing my stuff... 
    } 

    while (some boolean value); 
} 

Mein ManualResetEvent:

private static ManualResetEvent _manualResetEvent; 

public static ManualResetEvent ManualResetEvent 
{ 
    get { return _manualResetEvent; } 
    set { _manualResetEvent = value; } 
} 

ManualResetEvent = new ManualResetEvent(false); 

In einem gewissen Punkt in meinem Code über Button ich möchte nur frieren meine Operation:

private void btnPause_Click(object sender, RoutedEventArgs e) 
{ 
    ManualResetEvent.WaitOne(); 
} 

Ist das der richtige Weg, das zu tun?

+0

auf das, was abhängig initialisieren Ihr Thread ist, wenn es Ihr UI-Thread ist, können Sie es nicht so blockieren. –

+0

Nein, das ist kein UI-Thread – user979033

+0

Haben Sie daran gedacht, eine Threading.Timer- und eine CancellationToken-Kombination zu verwenden? Dies würde die gleiche Funktionalität geben, ohne einen Thread zu blockieren. –

Antwort

2

Sie haben Ihre zwei Funktionen rückwärts. Die Schleife, die Sie warten möchten, muss die .WaitOne() verwenden. Auch, wenn Sie wollen, dass es beim Start ausführen müssen Sie die Reset-Ereignis true

init

private static ManualResetEvent _manualResetEvent; 

public static ManualResetEvent ManualResetEvent 
{ 
    get { return _manualResetEvent; } 
    set { _manualResetEvent = value; } 
} 

ManualResetEvent = new ManualResetEvent(true); //Set it to true to let it run at the start. 

Schleife

do 
    { 
     ManualResetEvent.WaitOne(); // Here i want to wait 

     // Here i am doing my stuff... 
    } 

    while (some boolean value); 
} 

anderswo

private void btnPause_Click(object sender, RoutedEventArgs e) 
{ 
    ManualResetEvent.Reset(); 
} 
private void btnUnPause_Click(object sender, RoutedEventArgs e) 
{ 
    ManualResetEvent.Set(); 
}