使用穿线时,Gui会冻结

时间:2011-03-04 14:03:54

标签: c# multithreading user-interface freeze

我被困住了,希望有人可以帮助我。

我已经制作了一个类/ gui,其加载栏设置为选取框,以便在执行任务时我可以将其显示给用户。

在我的一个gui类中,在第一行的构造函数中,我正在创建此类的新实例然后执行

    LoadingBar bar = new LoadingBar();
    Thread thread = new Thread(bar.Show);
    thread.Start();

然而,即使主程序线程正在做一些更密集的事情,这个gui似乎仍然会冻结,即使我使用backround worker。

我提到的方法有什么问题,如果有,我需要改变什么?

由于

4 个答案:

答案 0 :(得分:6)

您需要撤消您的方法。当工作在“工作线程”(通常是BackGroundWorker)中完成时,GUI需要保留在主线程中。然后工作人员向GUI报告然后更新。

答案 1 :(得分:2)

你最好做相反的事情。在线程(或后台工作程序)中进行密集工作,并在主应用程序线程中显示等待屏幕。

答案 2 :(得分:1)

您需要使用BackgroundWorker。将一个拖到表单上,点击backgroundWorker1并将WorkerReportsProgress属性设置为True

然后转到事件(通过属性窗口)并附加

的处理程序
  • DoWork,这是进度条表示的所有工作。您将通过此“报告进度”,后台工作人员将确保在UI线程上调用ProgressChanged。
  • ProgressChanged,这是根据报告给方法的进度和状态数据更新UI的地方

DoWork事件看起来像这样

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var userState = new StateClass();

    while (working)
    {
        // TODO: do work here

        // update the state surrounding this task via userState
        userState.property = "some status";

        // report the progress so that backgroundWorker1_ProgressChanged gets called 
        this.backgroundWorker1.ReportProgress(percentComplete, userState);
    }

}

ProgressChanged事件看起来像这样

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // e.UserState contains the state data you passed to ReportProgress, 
    //   you have to cast it to the right type though, since its of type object
    var userState = (StateClass)e.UserState;
    int progress = e.ProgressPercentage;

    // TODO: report progress to the UI with the above variables
}

现在你所要做的就是告诉后台工作人员通过电话来做工作 this.backgroundWorker1.RunWorkerAsync()

答案 3 :(得分:0)

我不认为你在后台工作人员中完成所有工作,或者GUI不会冻结。我们需要查看更多代码,或者您需要再次查看后台工作程序示例,以了解可能出现的问题。

修改

在报告进度调用后向System.Threading.Thread.Sleep(1);添加电话