c# - 在 C# 中暂停和恢复 For 循环

标签 c#

我正在用 C# 开发一个 Windows 应用程序,我有一个 for 循环,可以在循环中更新某些内容,并且表单上有 3 个名为“停止、暂停、恢复”的按钮。所以其用途与命名的按钮相同。有谁知道该怎么做吗?

这是循环

    private void btnCompleteAuto_Click(object sender, EventArgs e)
    {
        setGeneralValue();
        for (int i = 1; i <= autoGridView.Rows.Count - 1; i++)
        {
            if (SRP == "Pause") // this is what I was thinking but it won't work
            {                   // it will step into end-less loop
              do                // how to stop this loop on "Resume" button click
              {

              }while(SRP!="Resume")

            }
            car = false;
            try
            {
                MemberID = Convert.ToInt64(autoGridView.Rows[0].Cells["Member_ID"].Value);
                DispID = Convert.ToString(autoGridView.Rows[0].Cells["Disp_Id"].Value);
                Mobile = Convert.ToString(autoGridView.Rows[0].Cells["Mobile"].Value);
                DueDate = Convert.ToString(autoGridView.Rows[0].Cells["Due_Date"].Value);

            }
            catch (Exception)
            {
                MessageBox.Show("Row Not Found");
            }

            AutoRecharge(network_name, pack_name, Mobile, Mobile, Convert.ToString(autoGridView.Rows[0].Cells["Rck_Amt"].Value), vendor_id, vendor_pwd, pack_id, oxinetwork_id);
            autoGridView.Rows.RemoveAt(0);
        }
    }

这是我在其中设置变量的 3 个按钮事件

    private void btnPause_Click(object sender, EventArgs e)
    {
        SRP = "Pause";
    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        SRP = "Stop";
        autoGridView.DataSource = "";
    }

    private void btnResume_Click(object sender, EventArgs e)
    {
        SRP = "Resume";
    }

最佳答案

这不能按您的预期工作的原因是:

Windows 窗体应用程序使用单个 UI 线程,该线程不断处理来自队列的传入消息。附加到 Windows 窗体控件事件的任何事件处理程序都会发送到此队列并由 UI 线程尽快处理。

您的btnCompleteAuto_Click 就是这样的处理程序之一。一旦启动,UI 线程将不再处理任何其他事情,直到它退出。因此,您附加到其他事件(btnPause_ClickbtnStop_Click 等)的任何其他处理程序都必须等待轮到它们,因为它们将在同一个 (UI) 线程上运行。

如果您想要暂停/恢复功能,则必须在单独的线程上实现。

实现它的一种可能方法可能是使用BackgroundWorker,如 suggested by saurabh .

这是更新后的代码的粗略草图(我什至没有尝试编译这个,更不用说调试它了;它只是作为一个如何实现此功能的基本概述)。

但是,您需要注意,直接从非 UI 线程访问 UI 控件是禁忌。使用诸如 BackgroundWorker.ProgressChanged 事件之类的机制来处理您需要根据非 UI 线程上的事件进行的任何 UI 更新。

ManualResetEvent _busy = new ManualResetEvent(false);

private void btnCompleteAuto_Click(object sender, EventArgs e)
{
    if (!backgroundWorker.IsBusy)
    {
        _busy.Set();
        btnAutoCompleteAuto.Text = "Pause";
        backgroundWorker.RunWorkerAsync();
    }
    else
    {
        _busy.Reset();
        btnAutoCompleteAuto.Text = "Resume";
    }

    btnStop.Enabled = true;
}

private void btnStop_Click(object sender, EventArgs e)
{
    _busy.Set();
    backgroundWorker.CancelAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // for (something)
    // {

        _busy.WaitOne();

        if (backgroundWorker.CancellationPending)
        {
            return;
        }

        // Do your work here.

    // }
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    _busy.Reset();
    btnAutoCompleteAuto.Text = "Start";
    btnStop.Enabled = false;
}

关于c# - 在 C# 中暂停和恢复 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3924275/

相关文章:

c# - 使用 C# 更改 "ClientSettingsSection"中的设置

c# - 从 GAC 动态加载最新的程序集版本

C# - 在没有 Outlook 回形针图标的情况下发送带有内联附件的电子邮件?

c# - 热逻辑比较 bool 数组与它自己的单个 bool 结果?

c# - EntityFramework 同表多对多关系

c# - 与 ShouldBeEquivalentTo 相反

c# - ASP.NET 4 路由问题

c# - 允许用户进行表单例份验证在 Azure 网站中不起作用

c# - 以编程方式访问所有用户开始菜单

javascript - 使用 asp.net 和母版页在 ListView 中维护回发时的滚动位置