如果我有一个类似这样的方法
if (ab)
{
//dostuff
}
else if (b)
{
//dostuff
}
else if (c)
{
//do stuff.
}
每个关闭当前打开的表单,并重新显示具有不同数据的新表单。我如何用一个显示加载栏的表单来包装每个表单,只是为了让用户没有加载任何东西。
我无法打开新线程中的加载表单,因为进度条没有进展,看起来很傻,有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。