我正在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)
我知道很多人都在谈论多线程,但我觉得我现在的水平太低了,所以如果我能避免它,我会的。
编辑:我最终使用多线程,感谢所有答案,它真的帮助了我很多,但当时多线程很难理解。答案 0 :(得分:4)
您应该考虑将您的工作推向后台线程。原因是因为在while
循环期间主UI线程被停止,这意味着无法访问该按钮以将其关闭。 (我知道你说你想避免使用多个线程,但实际情况是你需要在这种情况下使用它们。)
最简单的方法可能是使用BackgroundWorker。它将为您处理很多线程产生的事情。您可以在后台工作程序的while
事件处理程序中执行DoWork
循环。这将释放UI线程,这意味着按钮将是可点击的,此时您可以设置标志以停止循环。
答案 1 :(得分:2)
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();
}
}
请参阅:
答案 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)