C# 用于监视进程的WPF线程。启动并显示进度条
我正在尝试执行一个长时间运行的进程。Start(),并在进程执行时在屏幕上显示一个循环进度条 我有以下几行代码:C# 用于监视进程的WPF线程。启动并显示进度条,c#,wpf,multithreading,C#,Wpf,Multithreading,我正在尝试执行一个长时间运行的进程。Start(),并在进程执行时在屏幕上显示一个循环进度条 我有以下几行代码: Process p = Process.Start(longRunningProcess); // show the circular progress bar; ShowHideCirProgBar(true); // wait till the process ends execution p.WaitForExit(); // hi
Process p =
Process.Start(longRunningProcess);
// show the circular progress bar;
ShowHideCirProgBar(true);
// wait till the process ends execution
p.WaitForExit();
// hide the circular progress bar
ShowHideCirProgBar(false);
我是线程模型的新手,不知道如何实现上述模型。任何帮助都将不胜感激
谢谢,
我想,你应该试试看 我认为,在执行后台任务时,您希望实现一个响应用户界面 如果这是caxe,您可以使用后台工作类,我认为这个类是最基本的类,如果您是线程概念的初学者,它工作得很漂亮,理解起来不那么复杂 此类公开事件,您可以在长时间运行的场景中订阅这些事件
class ThreadingWithBg
{
BackgroundWorker bg = null;
public ThreadingWithBg()
{
bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
}
void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
void bg_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i.ToString());
}
}
public void DoLongWork()
{
bg.RunWorkerAsync();
}
}
带BG的类线程
{
BackgroundWorker bg=null;
使用BG()的公共线程
{
bg=新的BackgroundWorker();
bg.DoWork+=新DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bg\u RunWorkerCompleted);
}
void bg_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
}
无效bg_DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i<100000;i++)
{
Console.WriteLine(i.ToString());
}
}
公共工程
{
bg.RunWorkerAsync();
}
}
不幸的是,呼叫:
p.WaitForExit();
将导致程序执行阻塞,直到生成的可执行文件退出。这将阻止WPF处理其消息泵,从而阻止进度条正确更新
处理此问题的正常方法是禁用UI元素,然后在后台线程中生成进程,显示进度。流程完成后,重新启用UI元素。使用.NET 4,这可能类似于:
// Add code to disable UI, if required
DisableUI();
// Show the circular progress bar;
ShowHideCirProgBar(true);
// Wait till the process ends execution in a background thread
var task = Task.Factory.StartNew( () =>
{
Process p = Process.Start(longRunningProcess);
p.WaitForExit();
});
// Reenable the UI when the process completes...
task.ContinueWith( t =>
{
EnableUI();
// hide the circular progress bar
ShowHideCirProgBar(false);
}, TaskScheduler.FromCurrentSynchronizationContext());
或者,您可以通过BackgroundWorker做同样的事情:
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, e) =>
{
Process p = Process.Start(longRunningProcess);
p.WaitForExit();
};
bw.RunWorkerCompleted += (s, e) =>
{
EnableUI();
// hide the circular progress bar
ShowHideCirProgBar(false);
};
// Add code to disable UI, if required
DisableUI();
// Show the circular progress bar;
ShowHideCirProgBar(true);
bw.RunWorkerAsync();
你想要实现什么?那么,你想要进度指示器,但是没有它阻止UI线程?您同意用户在外部进程完成之前做一些事情吗?不,我不希望用户在执行继续时做任何事情。这就是为什么当圆形进度条出现时,我也会禁用屏幕。你可以清楚地看到我的代码,它正在显示,但没有旋转。Saurabh:你能为我的具体案例提供一些代码片段吗?当然,等一段时间,我会发布Hi Reed:谢谢你的代码片段。我使用的是.NET3.5,我认为它没有TPL。@PJ:你应该把这条评论放在我的帖子上,所以我看到了。也就是说,如果您在这里安装Rx扩展,您就可以做到这一点:(它随.NET3.5的TPL一起提供)。你也可以使用BW——我会把它添加到我的帖子中……非常感谢Saurabh和Reed。让我马上试试这些。我会很快回复结果的。嗨,里德:它完全按照我想要的方式工作。非常感谢你。我真的非常感谢你的帮助。