-1

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

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

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

4

3 回答 3

4

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

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

于 2013-08-28T12:35:33.077 回答
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();
    }
}

看:

于 2013-08-28T12:42:01.330 回答
-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)
于 2013-08-28T12:38:15.707 回答