我正在使用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";
}
答案 0 :(得分:4)
这不能按预期工作的原因是:
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;
}
答案 1 :(得分:2)
在我们的评论中阅读您的实际要求后,我建议使用支持取消正在运行的过程的后台工作者类。