我正在用 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_Click
、btnStop_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/