如何在C#中同时运行两个操作

问题描述:

我在WPF应用程序中遇到问题。我有一个自定义CircularProgressBar。当我从数据库中检索数据时,需要几秒钟的时间。如何在C#中同时运行两个操作

我想在检索数据时在我的应用中显示CircularProgressBar。在我的自定义类(Printer

CircularProgressBar cb = new CircularProgressBar(); 
stk.Children.Add(cb); 

ThreadStart thStart = delegate() 
{ 
    ThreadStart inv = delegate() 
    { 
     stk.Children.Remove(cb); 

    }; 
    this.Dispatcher.Invoke(inv, null); 
}; 

Thread myThread = new Thread(thStart); 
myThread.Start(); 

此代码运行CircularProgressBar

在哪里我把这个窗口:

Printer p = new Printer(); 

p.Show(); 

//Code For retrieve Data from DataBase 

p.close(); 

所以出现这种情况:CircularProgressBar显示几秒钟,并没有运行。我的bug在哪里?

+2

使用后台工作者。 [这可能有所帮助](http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker) – musefan 2013-03-14 17:51:32

+0

@abbas Pirmoradi:使用后台工作,并用progreschanged事件更新进度栏值。 – KF2 2013-03-14 18:06:04

您可以简单地使用背景工人:

private BackgroundWorker bw = new BackgroundWorker(); 

bw.WorkerReportsProgress = true; 
bw.WorkerSupportsCancellation = true; 
bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
//load data from database 
System.Threading.Thread.Sleep(1); 
worker.ReportProgress(progressbar_value); 
} 

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
Progress.value= progressbar_value; 
} 

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
//progress completed 
} 

这不是你如何在WPF做的东西 - 使用一个模型来从数据库中填充数据,比CircularProgressBar知名度绑定到 状态你”重新进入(当你完成任务时隐藏它)。 所有这些样板代码应该在xaml中。

如果我是你,我会通过使用数据绑定和依赖属性来简化生活。 遵循什么步骤。

1)在自定义进度条中创建一个名为IsBusyProperty的依赖属性,其类型为bool。

2)向其值更改事件注册委托(这是在创建依赖项属性时完成的)。

3)现在,您可以将此IsBusyProperty绑定到代码中的一个状态,表示嘿,我很忙。

4)当这个值被设置为true时,你会得到你的进度条来开始它的魔法。 5)当它被设置为false时,你停止魔法。

+0

以上所有对我有用。感谢所有你。我试试这个 – 2013-03-16 11:41:53

创建一个旋转故事板的控件要简单得多,只要你的UI没有锁定,它就会旋转,然后简单地杀死它。

Try this