单击按钮从循环中断-C#

Hellooo123

我有一个关于按钮单击事件循环的问题,在过去的一个小时中,我尝试了许多方法并搜索了许多页面以寻找简单的答案,但事实是每个答案看起来都像是外来代码,可能是因为我仍然对开发来说非常新。

这是我正在尝试做的简化版本:

private string Message = "Hello";

private void Spam(bool loop)
{
    if (loop == true)
    {
        while (loop == true)
        {
            MessageBox.Show(Message);
        }
    }
    else { MessageBox.Show("Spamming has stopped !! "); }
}

private void button1_Click(object sender, EventArgs e)
{
    Spam(true);
}
private void button2_Click(object sender, EventArgs e)
{
    Spam(false);
}

显然,这不是我的API,或者发明起来毫无用处,但是代码本身很长,你们总是要求“相关代码”(不要轻视),所以就可以了。

我的问题:单击按钮2突破垃圾邮件循环,对我来说,代码看起来不错,API可以确定,但是每次单击按钮1时,API都会冻结。

史蒂夫16351

使用后台工作者来完成您的工作。完成后,您可以使用取消功能来取消它。循环执行时,循环将阻塞UI线程,这就是GUI变得无响应的原因。请注意,如果您在do work委托中与UI进行了任何交互,则需要将其编组回UI线程(例如通过调用)。

private BackgroundWorker _worker = null;

private void goButton_Click(object sender, EventArgs e)
{
    _worker = new BackgroundWorker();
    _worker.WorkerSupportsCancellation = true;

    _worker.DoWork += new DoWorkEventHandler((state, args) =>
    {
        do
        {
            if (_worker.CancellationPending)                
                break;

            Console.WriteLine("Hello, world");

        } while (true);
    });

    _worker.RunWorkerAsync();
    goButton.Enabled = false;
    stopButton.Enabled = true;
}

private void stopButton_Click(object sender, EventArgs e)
{
    stopButton.Enabled = false;
    goButton.Enabled = true;
    _worker.CancelAsync();
}

更新2019BackgroundWorker现在已基本过时,已由async/await易于使用的更高版本的C#中功能取代这是如何使用该功能实现相同功能的示例:

private CancellationTokenSource _canceller;

private async void goButton_Click(object sender, EventArgs e)
{
    goButton.Enabled = false;
    stopButton.Enabled = true;

    _canceller = new CancellationTokenSource();
    await Task.Run(() =>
    {
        do
        {
            Console.WriteLine("Hello, world");
            if (_canceller.Token.IsCancellationRequested)
                break;

        } while (true);
    });

    _canceller.Dispose();
    goButton.Enabled = true;
    stopButton.Enabled = false;
}

private void stopButton_Click(object sender, EventArgs e)
{
    _canceller.Cancel();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在按钮单击时立即中断 while 循环 c# mvc

来自分类Dev

C#暂停循环并在单击按钮后继续

来自分类Dev

C#:在 for 循环中求和

来自分类Dev

while循环中的布尔语句C#

来自分类Dev

C#在for循环中更改控件的名称

来自分类Dev

从C#更改for循环中的arduino变量

来自分类Dev

从C#循环中获取最新数据

来自分类Dev

使用C#循环中的褪色

来自分类Dev

IWebElements的foreach循环中的StaleElementException c#

来自分类Dev

foreach循环中的if语句c#

来自分类Dev

如何通过使用C#单击按钮来中止while循环

来自分类Dev

如何通过使用C#单击按钮来中止while循环

来自分类Dev

C#按钮单击增加字母

来自分类Dev

WinForm C#中的自动单击按钮

来自分类Dev

单击按钮上的停靠面板C#

来自分类Dev

在C#中单击按钮停止线程

来自分类Dev

C#按钮单击事件不会触发

来自分类Dev

WinForm C#中的自动单击按钮

来自分类Dev

在C#中单击按钮绘制矩形

来自分类Dev

多个按钮按顺序单击(C#)

来自分类Dev

C#中按钮的单击事件

来自分类Dev

单击相同的按钮但操作不同 - c#

来自分类Dev

如何使用 Selenium C# 单击按钮

来自分类Dev

IF ELSE循环中的按钮单击事件

来自分类Dev

关联按钮并单击循环中的动作

来自分类Dev

在for循环中返回单击的按钮

来自分类Dev

在循环中设置单击按钮事件

来自分类Dev

如何继续在嵌入式C while循环中接收定时中断?

来自分类Dev

如何在循环 C# 中中断等待协程?