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

我正在使用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)线程上运行。

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

实现它的一种可能方法可能是使用BackgroundWorker ,如saurabh所建议的那样 。

这是一个粗略的草图,说明您的更新代码可能是什么样的(我甚至没有尝试编译它,更不用说调试它了;它只是作为如何完成此function的基本概述)。

但是,您需要注意,直接从非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; } 

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

看这里