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

时间:2010-10-13 13:37:25

标签: 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";
    }

2 个答案:

答案 0 :(得分:4)

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

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

你的btnCompleteAuto_Click就是这样一个处理程序。一旦启动, UI线程将处理其他内容,直到它退出。因此,您附加到其他事件(btnPause_ClickbtnStop_Click等)的任何其他处理程序必须等待,因为它们将在相同(UI)线程。

如果你想要暂停/恢复功能,这个在一个单独的线程上实现。

实现它的一种可能方法可能是使用BackgroundWorkersuggested 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;
}

答案 1 :(得分:2)

在我们的评论中阅读您的实际要求后,我建议使用支持取消正在运行的过程的后台工作者类。

See here

相关问题