后台工作者,如何构造命令

时间:2011-05-20 07:56:07

标签: c# backgroundworker

如果我有一个类似这样的方法

    if (ab)
    {
        //dostuff
    }
    else if (b)
    {
        //dostuff
    }
    else if (c)
    {
        //do stuff.
    }

每个关闭当前打开的表单,并重新显示具有不同数据的新表单。我如何用一个显示加载栏的表单来包装每个表单,只是为了让用户没有加载任何东西。

我无法打开新线程中的加载表单,因为进度条没有进展,看起来很傻,有3个不同的后台工作人员做了相同的工作方法。

感谢

3 个答案:

答案 0 :(得分:0)

您可以轻松地将数据传递到BackgroundWorker

BackgroundWorker bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.WorkerReportsProgress = true;

if (ab)
{
    //dostuff
    bw.RunWorkerAsync("ab"); // Run
}
else if (b)
{
    //dostuff
    bw.RunWorkerAsync("b"); // Run
}
else if (c)
{
    //do stuff.
    bw.RunWorkerAsync("c"); // Run
}

然后,有:

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    string from = sender as string;

    switch case (string)
    {
        case "ab" : 
                   // process
                   break;
        case "b" : 
                   // process
                   break;
        case "c" : 
                   // process
                   break;
    }
}

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Add here your progress output
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Add here your completed output
}

答案 1 :(得分:0)

处理ProgressChanged event以更新进度条?这将在UI线程上运行回调。

由于BackgroundWorker通过DoWork event运行任务,因此可以在所有情况下(或任意方法)连接到相同的方法。如果使用闭包(读取:lambdas / anon函数),可以简单地保持正确的绑定。

BackgroundWorker bw = new BackgroundWorker();
// ... other setup such as a unified ProgressChanged

if (ab) {
    var greeting = "Hello";
    var name = "Fred";
    bw.DoWork += (sender, args) => {
        // this can be entirely unique or funnel to something unified.
        CallSomeSharedMethods();
        // use some bound variables (carefully)
        // closures are nifty, but watch mutations and lifetimes
        // (I find this generally easier than dealing with the DoWorkArgs data)
        Console.WriteLine(greeting + " " + name + "!");
        // update some progress
        bw.ReportProgress(100);
    };
} else {
    // likewise for others re-using as much
    // (or little) as required
}

快乐的编码。

答案 2 :(得分:0)

正如balexandre已经注意到的,您可以将数据传递给Worker。但是这个数据也可以通过Action或Func。因此,您可以传入应在后台工作程序中执行的任何方法。可以在this answer中找到一个示例。

但请注意,如果尝试在后台工作程序任务中设置gui元素的任何属性,则可能会遇到跨线程异常。要完成此操作BeginInvoke,您的朋友也可以封装在extension method