Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将不同的方法/函数传递给后台工作人员的DoWork事件_C#_Backgroundworker - Fatal编程技术网

C# 将不同的方法/函数传递给后台工作人员的DoWork事件

C# 将不同的方法/函数传递给后台工作人员的DoWork事件,c#,backgroundworker,C#,Backgroundworker,请容忍我对这个问题和我使用的术语的无知。请纠正我的错误 我在表单中使用了工具箱中的后台工作程序,并将一个方法传递给DoWork事件。在第一次尝试使用后台工作程序时,我了解到我可以使用我为一个任务创建的后台工作程序。见下面的代码: private void btn1_Click(object sender, EventArgs e) { // Should call the uploadToDB1 using BackgroundWorker's DoWork event. bac

请容忍我对这个问题和我使用的术语的无知。请纠正我的错误

我在表单中使用了工具箱中的后台工作程序,并将一个方法传递给DoWork事件。在第一次尝试使用后台工作程序时,我了解到我可以使用我为一个任务创建的后台工作程序。见下面的代码:

private void btn1_Click(object sender, EventArgs e)
{
   // Should call the uploadToDB1 using BackgroundWorker's DoWork event.
     backgroundWorker1.RunWorkerAsync();
}

private void btn2_Click(object sender, EventArgs e)
{
    // Should call the uploadToDB2 using BackgroundWorker's DoWork event.
    backgroundWorker1.RunWorkerAsync();
}

private void uploadToDB1()
{
    // Code for uploading to DB 1.
}        

private void uploadToDB2()
{
    // Code for uploading to DB 2.
}  

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    try
    {

        uploadToDB1(); // I want to change this to uploadToDB2 i.e. a variable method, How do I assign a call to this?

    }
    catch (Exception ex)
    {

        MessageBox.Show(ex.Message);
    }

}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Visible = true;
    progressBar1.Maximum = maxRecords;
    lblProgress.Text = Convert.ToString(e.ProgressPercentage.ToString() + "/" + maxRecords);
    progressBar1.Value = e.ProgressPercentage;

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBar1.Visible = false;
    lblProgress.Text = "";
}
我需要能够动态地将方法传递给DoWork事件,而无需创建多个后台工作程序,因为与后台工作程序相关的其余事件中的操作保持不变

你能告诉我该怎么做吗

使用TPL更新了代码,但是我得到了一个跨线程错误。你能帮我更正一下密码吗?只有在上传到DB 1完成后,才能上传到DB 2。因此,每次上传时,标签和进度条都需要更新。我还需要向标签传递不同的文本

private void btn1_Click(object sender, EventArgs e)
{
    Task.Factory.StartNew(uploadToDB1);
}
private void uploadToDB1()
{
    for(i=0;i<dt.rows.count-1;i++)
    {
        // Code for inserting into DB1.

        progressbar1.maximum=dt.rows.count-1;
        progressbar1.value=i;
    }
    uploadToDB2();

}

private void uploadToDB2()
{
    for(i=0;i<dt.rows.count-1;i++)
    {
        // Code for inserting into DB2.

        progressbar1.maximum=dt.rows.count-1;
        progressbar1.value=i;
    }

}
private void btn1\u单击(对象发送者,事件参数e)
{
Task.Factory.StartNew(上传到B1);
}
私有void uploadToDB1()
{
对于(i=0;i您所能做的,有点麻烦的是,将
操作
作为调用您的
doworksync
的参数传递给您:

var bw = new BackgroundWorker();
bw.DoWork += (s, o) => 
{
    Action actualWork = (Action)o.Argument;
    actualWork();
}
Action action = () => DoSomething();
bw.RunWorkerAsync(action);
当您调用
doworksync
时:

var bw = new BackgroundWorker();
bw.DoWork += (s, o) => 
{
    Action actualWork = (Action)o.Argument;
    actualWork();
}
Action action = () => DoSomething();
bw.RunWorkerAsync(action);
相反,正如@Sriram所建议的那样,看看能让你的生活更轻松一点的:

private async void btn1_Click(object sender, EventArgs e)
{
    await Task.Run(UpdateFirst);
    // Update UI here.
}

private async void btn2_Click(object sender, EventArgs e)
{
    await Task.Run(UpdateSecond);
    // Update UI again.
}

关于TPL和
i程序的使用,可以在

中找到一个广泛的答案,为什么不创建两个背景工人,每个工作一个?为什么不直接抛出
背景工人
并使用TPL?策略模式可能会帮到你too@SriramSakthivel“后台工作人员是l33t的。”YuvalItzchakov,是的,我确实想到了,但当我例如,backgroundWorker的其他事件中的操作是相同的。如果可能的话,我希望能够重新使用代码。有两个基本上概括了OP的要求。使用TPL的
IProgress
向UI提供反馈。@SriramSakthivel现在你告诉我了吗?:\这允许我更新标签和进度条吗?如果是的话我该怎么做?我问这个问题的原因是,我一直在努力使进度条与实际上传进度相匹配,并且第一次使用backgroundWorker,它工作起来很有魅力。@svb请查看提供的链接。我还更新了我的答案,以包括该链接,因为它有一个更广泛的答案。@svb您正在使用backgroundWorker进行上传使用
await
和异步I/O,这是一种非常容易处理的方法,不需要单独的线程。