2013-08-28 128 views
-1

我在的WinForms(C#)在MS Visual Studio中做節目2012C#While循環,直到按鈕點擊

我需要的代碼要做到這一點

code code code 
Event for button click from user 
//Start while loop.. 
Do 
{ 
code code code 
code code code 
} (!button not click again) 

我知道很多談論的多線程,但我認爲我現在的工作水平太低,所以如果我能避免它,我會的。

編輯:我結束了使用多線程,感謝所有這真的幫了我很多的答案,但在當時多線程是很難理解的。

+1

多線程使用後臺工作時,真的不難。 [點網珍珠有一個很好的教程(http://www.dotnetperls.com/backgroundworker) – Erresen

回答

4

你應該看看你推到工作後臺線程。原因是因爲主循環線程在while循環期間停止,這意味着該按鈕將無法訪問以關閉它。 (我知道你說你想避免多個線程,但現實是你需要在這種情況下使用它們)。

最簡單的方法很可能是使用BackgroundWorker。它會爲你處理很多事情的線程產生方面。您可以在後臺工作人員的DoWork事件處理程序中執行while循環。這將釋放UI線程,這意味着該按鈕將是可點擊的,您可以在該點設置標誌來停止您的循環。

+0

那麼我就嘗試了這一點,我就接受你的答案,如果我得到它:-)否則我會回去的工作問你。 坦克的幫助。 –

+1

祝你好運:)如果你無法正常工作,你可以通過顯示你所做的事情來獲得最佳答案,以便我們嘗試並幫助修復你的代碼。 – keyboardP

+0

感謝您的幫助。 背景工作者爲我做了詭計。 –

-1

我勸你看看線程,這是一個簡易的解決方案,我不支持這種編程,但對於一個初學者來說,這是一個開始的方式。

code code code 
Event for button click from user 
//Start while loop.. 
Do 
{ 
code code code 
code code code 
    Application.DoEvents(); 
} (!button not click again) 
+2

您不應該使用Application.DoEvents。 –

2

Dispatcher線程將被while迴路被阻斷,因此它不能處理的消息這就是爲什麼應用程序凍結。您可以使用BackgroundWorkerTask類移動邏輯關Dispatcher

public partial class Form1 : Form 
{ 
    // CancellationTokenSource will hold the CancellationToken struct 
    private readonly CancellationTokenSource _cts = new CancellationTokenSource(); 

    // Task will hold the logic 
    private readonly Task _task; 

    public Form1() 
    { 
     InitializeComponents(); 

     // The task will be started on the ThreadPool off the Dispatcher thread 
     _task = Task.Factory.StartNew(() => EventLoop(_cts.Token), _cts.Token); 
    } 

    private void EventLoop(CancellationToken token) 
    { 
     while(!token.IsCancellationRequested) 
     { 
      // Do work 
     } 

     // This exception will be handled by the Task 
     // and will not cause the program to crash 
     token.ThrowIfCancellationRequested(); 
    } 

    private void ButtonClick(object sender, EventArgs e) 
    { 
     _cts.Cancel(); 
    } 
} 

參見: