2013-08-28 127 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(); 
    } 
} 

参见: