我在后台工作器上执行了一段很长的代码,但有时我们会遇到网络问题并显示 web 异常,为了处理它,我想在异常块中再次调用该函数,我尝试在取消后再次在同一个后台工作器上调用函数,但是好像我做的不对,
请检查我的代码,它真的很长,所以我只在此处发布必要的详细信息,如果不够,请提前抱歉(在这种情况下请告诉我)
public static DataSet ds_input;
private void btn_process_Click(object sender, EventArgs e)
{
//some code here to fetch data and call backgroundworker
backgroundWorker1.RunWorkerAsync(ds);
}
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//ds_input is a dataset with data in it
e.Result = check_number(ds_input);
}
private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
int i = e.ProgressPercentage;
int j = showProgress(i, Total_Record);
lbl_counter.Text = "Processing " + Convert.ToString(i + 1) + " / " + Convert.ToString(Total_Record) + " ";
}
private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
DataTable dt = e.Result as DataTable;
Grid_records.DataSource = e.Result;
}
public void check_number(DataSet ds)
{
try
{
// logic here to perform execution
//sometime it break due to internet connectivity
// i want to resume it in catch block
}
catch (System.Net.WebException ex)
{
//how to run backgroundWorker1 here again
// i did this
backgroundWorker1.CancelAsync();
backgroundWorker1.Dispose();
backgroundWorker1.RunWorkerAsync(ds_input);
// but it says -This BackgroundWorker is currently busy and cannot run multiple tasks concurrently.
//how to resume the function on same backgroundWorker1
}
finally
{
}
}
}
我会以一种不需要重新运行后台工作程序但如果结果不符合预期的方式重新运行操作的方式调整执行逻辑。也许是这样的:
public static DataSet ds_input;
private void btn_process_Click(object sender, EventArgs e)
{
//some code here to fetch data and call backgroundworker
backgroundWorker1.RunWorkerAsync(ds);
}
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
bool success = false;
do
{
try
{
e.Result = check_number(ds_input);
success = true;
}
catch (System.Net.WebException ex)
{
success = false;
}
}while(!success);
}
private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
int i = e.ProgressPercentage;
int j = showProgress(i, Total_Record);
lbl_counter.Text = "Processing " + Convert.ToString(i + 1) + " / " + Convert.ToString(Total_Record) + " ";
}
private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
DataTable dt = e.Result as DataTable;
Grid_records.DataSource = e.Result;
}
public DataTable check_number(DataSet ds)
{
// Do whatever is needed
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句