2014-08-27 14 views
0

我需要停止執行程序,直到用戶單擊按鈕。我正在做一個離散事件模擬,目前的目標是提供說明情況的簡單圖形。當模擬達到一個值得展示的事件時,就會調用描繪情況的方法。我需要的方法是,不要跳回到模擬核心,直到用戶單擊按鈕(僅當到達有趣的點時再次調用)。C#停止執行,直到發生事件

+1

這不是一個問題。請顯示您嘗試過的方式以及您遇到問題的位置。我們不在這裏爲你編寫你的程序。 – BradleyDotNET 2014-08-27 17:17:43

+0

我不知道我明白。 '如何在事件發生之前停止執行?'的哪一部分?是不是一個問題?我可以想到的解決方案就像while(buttonnotclicked){}這浪費了CPU時間無所事事。 – Klobbbyyy 2014-08-27 17:26:32

+0

也許它只是沒有說清楚,但在我第一次閱讀時,我看到一大段文字描述你想要做什麼。你也開始說「停止執行程序」,這不是你對程序的做法。你可能會阻塞一個線程,但是停止執行意味着即使點擊按鈕也不會被響應。總的來說,這個問題沒有一個明確的問題,整個事情很難閱讀,混淆,缺乏努力和基本的理解。塞維給你一個很好的答案,但它仍然是一個不好的問題。 – BradleyDotNET 2014-08-27 17:41:28

回答

3

您可以創建一個方法,返回一個Task,當一個特定的按鈕被點擊時它會完成,它可以通過使用TaskCompletionSource對象來完成。然後,您可以await這項任務繼續執行你的方法是點擊一個特定的按鈕時:

public static Task WhenClicked(this Button button) 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
    EventHandler handler = null; 
    handler = (s, args) => 
    { 
     tcs.TrySetResult(true); 
     button.Click -= handler; 
    }; 
    button.Click += handler; 
    return tcs.Task; 
} 

這使您可以寫:

DoSomething(); 
await button1.WhenClicked(); 
DoSomethingElse(); 
+0

謝謝。你能告訴我在哪裏定義?我試圖把它放在Form類下面,但是會出錯。 – Klobbbyyy 2014-08-27 17:40:12

+0

@ MathN00b將它置於項目中的靜態頂級課程中。 – Servy 2014-08-27 17:47:00

+1

必須將包含'await'的方法更改爲'async'才能正常工作。非常感謝你! – Klobbbyyy 2014-08-27 17:57:05

相關問題