C#While循环直到按钮点击

本文关键字:按钮 循环 C#While | 更新日期: 2023-09-27 18:29:15

我正在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)

我知道很多人都在谈论多线程,但我认为我现在的水平太低了,无法使用它,所以如果我能避免它,我会的。

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

C#While循环直到按钮点击

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

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

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();
    }
}

参见:

  • CancellationToken
  • Task

我建议你看看线程,这是一个简单的解决方案,我不支持这种编程,但对于初学者来说,这是开始的一种方式。

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)