【问题标题】:Progress bar is more then i can code today for some reason由于某种原因,进度条比我今天可以编码更多
【发布时间】:2013-04-20 18:46:04
【问题描述】:

我在进度条方面遇到了严重问题。我正在构建一个自定义备份实用程序,它允许用户现在通过单击按钮强制更新。当他们单击该按钮时,它会调用一个隐藏控制台窗口的控制台应用程序运行完整备份过程,然后完成。在整个过程中没有状态或进度条,因为安装完成后它对用户是透明的......用户引起的问题我们都知道。在 GUI 交互期间,需要有一些东西告诉管理员它正在做某事。这是我的代码:

private void forback_Click(object sender, EventArgs e)
    {
        BackgroundWorker bg = new BackgroundWorker();
        bg.DoWork += new DoWorkEventHandler(MethodToGetInfo);
        bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
        progressBar1.Style = ProgressBarStyle.Marquee;
        bg.RunWorkerAsync();
    }

    void MethodToGetInfo(Object sender, DoWorkEventArgs args)
    {
        Process info = new Process();
        info.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        info.StartInfo.FileName = "C:\\Rameses\\Program\\Day_Cloud_Backup.exe";
        info.StartInfo.UseShellExecute = false;
        info.StartInfo.CreateNoWindow = true;
        info.StartInfo.RedirectStandardOutput = true;
        info.Start();
    }

    void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
    {
        MessageBox.Show("it's f***ing done");
    }

我到底做错了什么。我单击按钮,应用程序运行...但消息框立即显示并且进度条没有停止。

有什么想法吗?

【问题讨论】:

    标签: c# .net multithreading progress-bar


    【解决方案1】:

    这里有两件事。

    要让进度条停止,您需要在 RunWorkerCompleted 回调中告诉它停止(在您的情况下,更改样式)。

    为了让线程不立即返回,你需要阻塞线程等待你启动的进程完成。一种方法是使用 WaitForExit Process 方法:

    ...
    info.Start();
    info.WaitForExit();
    

    http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx

    这将使线程在调用 WorkerCompleted 回调之前等待,直到您的进程完成。

    【讨论】:

    • 谢谢。我没有注意到我错过了那个。显然深夜聚会和早上的编码都不能很好地工作。
    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多