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)
我知道很多人都在谈论多线程,但我认为我现在的水平太低了,无法使用它,所以如果我能避免它,我会的。
编辑:我最终使用了多线程,感谢所有的答案,它确实对我帮助很大,但当时多线程很难理解。
您应该考虑将您的工作推送到后台线程中。原因是主UI线程在while
循环期间被停止,这意味着无法访问按钮来关闭它。(我知道你说过你想避免多个线程,但事实是,在这种情况下你需要使用它们)。
最简单的方法可能是使用BackgroundWorker。它将为您处理许多线程生成方面的问题。您可以在后台工作程序的DoWork
事件处理程序中执行while
循环。这将释放UI线程,这意味着按钮将是可点击的,此时您可以设置标志来停止循环。
Dispatcher
线程将被while
循环阻塞,因此它无法处理消息,这就是应用程序冻结的原因。可以使用BackgroundWorker
或Task
类将逻辑从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)