C# 用于监视进程的WPF线程。启动并显示进度条

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

我正在尝试执行一个长时间运行的进程。Start(),并在进程执行时在屏幕上显示一个循环进度条

我有以下几行代码:

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。让我马上试试这些。我会很快回复结果的。嗨,里德:它完全按照我想要的方式工作。非常感谢你。我真的非常感谢你的帮助。