如何在c#中并发运行两个操作
本文关键字:两个 操作 运行 并发 | 更新日期: 2023-09-27 18:04:09
我在WPF应用程序中有一个问题。我有一个自定义CircularProgressBar
。当我从数据库中检索数据时,需要几秒钟。
我想在我的应用程序中显示CircularProgressBar
,而数据被检索。
这段代码运行CircularProgressBar
:
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();
在我的自定义类(Printer
)。
我调用这个窗口:
Printer p = new Printer();
p.Show();
//Code For retrieve Data from DataBase
p.close();
所以这发生了:CircularProgressBar
显示了几秒钟,它没有运行。我的虫子在哪里?
你可以简单地使用background worker:
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时,您将停止魔术
创建一个旋转的storyboard控件要简单得多,只要你的ui没有被锁定,它就会旋转,然后简单地杀死它。
试试这个