C#While循环直到按钮单击

时间:2013-08-28 12:30:47

标签: c# winforms

我正在MS visual studio 2012中的Winforms(C#)制作一个程序

我需要代码来执行此操作

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

我知道很多人都在谈论多线程,但我觉得我现在的水平太低了,所以如果我能避免它,我会的。

编辑:我最终使用多线程,感谢所有答案,它真的帮助了我很多,但当时多线程很难理解。

3 个答案:

答案 0 :(得分:4)

您应该考虑将您的工作推向后台线程。原因是因为在while循环期间主UI线程被停止,这意味着无法访问该按钮以将其关闭。 (我知道你说你想避免使用多个线程,但实际情况是你需要在这种情况下使用它们。)

最简单的方法可能是使用BackgroundWorker。它将为您处理很多线程产生的事情。您可以在后台工作程序的while事件处理程序中执行DoWork循环。这将释放UI线程,这意味着按钮将是可点击的,此时您可以设置标志以停止循环。

答案 1 :(得分: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();
    }
}

请参阅:

答案 2 :(得分:-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)