C# 发生错误时如何在backgroundworker上再次调用函数

C# 发生错误时如何在backgroundworker上再次调用函数,c#,C#,我正在backgroundworker上执行一个很长的代码,但有时我们会遇到网络问题,它会显示webexception,为了处理它,我想在exception块中再次调用该函数,在取消该函数后,我尝试在同一backgroundworker上再次调用该函数,但似乎我做得不对 请检查我的代码,它真的很长,所以我只是在这里张贴必要的细节,如果这是不够的,请提前道歉 (如果是那样,请告诉我) 我会调整执行逻辑,不需要重新运行backgroundworker,而是在结果不符合预期时重新运行操作。也许是这样的

我正在backgroundworker上执行一个很长的代码,但有时我们会遇到网络问题,它会显示webexception,为了处理它,我想在exception块中再次调用该函数,在取消该函数后,我尝试在同一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
    }
}