C# 发生错误时如何在backgroundworker上再次调用函数
我正在backgroundworker上执行一个很长的代码,但有时我们会遇到网络问题,它会显示webexception,为了处理它,我想在exception块中再次调用该函数,在取消该函数后,我尝试在同一backgroundworker上再次调用该函数,但似乎我做得不对 请检查我的代码,它真的很长,所以我只是在这里张贴必要的细节,如果这是不够的,请提前道歉 (如果是那样,请告诉我)C# 发生错误时如何在backgroundworker上再次调用函数,c#,C#,我正在backgroundworker上执行一个很长的代码,但有时我们会遇到网络问题,它会显示webexception,为了处理它,我想在exception块中再次调用该函数,在取消该函数后,我尝试在同一backgroundworker上再次调用该函数,但似乎我做得不对 请检查我的代码,它真的很长,所以我只是在这里张贴必要的细节,如果这是不够的,请提前道歉 (如果是那样,请告诉我) 我会调整执行逻辑,不需要重新运行backgroundworker,而是在结果不符合预期时重新运行操作。也许是这样的
我会调整执行逻辑,不需要重新运行backgroundworker,而是在结果不符合预期时重新运行操作。也许是这样的:
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
}
}
您不能使用disposed object.Zumbe,实际上它返回一个DataTable。您可能还应该实现一个健全性检查。假设只重新运行该方法20次,然后抛出异常。为了防止它永远运行,最好检查BackgroundWorker.CancellationPending是否为setThnaks,它给出了很多提示
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
}
}