2016-10-25 13 views
0

この作品待っています:作業が完了するまで、第1、さらにボタンのクリックをクリックした後SemaphoreSlimおよび非同期/

int _counter; 
readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); 

async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (_semaphore.Wait(0)) 
    { 
     Title = $"{ ++_counter}"; 
     await Task.Delay(1000); // simulate work 
     Title = $"{ --_counter}"; 
     _semaphore.Release(); 
    } 
} 

は無視されます。 Tittle1または0ことができます。

そして、これは継続的に

void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (_semaphore.Wait(0)) 
    { 
     Test(); // moving code into separate method 
     _semaphore.Release(); 
    } 
} 

async void Test() 
{ 
    Title = $"{ ++_counter}"; 
    await Task.Delay(1000); // simulate work 
    Title = $"{ --_counter}"; 
} 

クリックボタンがTittleから23、というように上昇する動作しません。

私は間違っていますか?

答えて

5

async voidは唯一のイベントハンドラに理にかなっています。これは、非同期の特殊なタイプです。それは "火と忘れ"を意味します。

Test()メソッドを起動して忘れたくはありません。あなたはそれが戻るのを待ちたいです。

にご Test署名を変更

// Note that it returns a "Task". A task is an awaitable promise. 
async Task Test() 
{ 
    //... 
} 

そして、あなたのイベントハンドラでそれを待つ:

async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (_semaphore.Wait(0)) 
    { 
     await Test(); // moving code into separate method 
     _semaphore.Release(); 
    } 
} 
関連する問題