这种线程在WPF / C#中效率低下吗?

时间:2011-04-06 09:01:14

标签: c# wpf multithreading user-interface performance

这样做效率低于设置后台工作线程吗?因为它运作良好,看起来更干净。在循环中,我调用BeginInvoke 3x - 向主窗口datagrid添加行,并更新进度条和消息。

public MyConstructor()
{
    InitializeComponent();

    ThreadStart start = delegate()
    {
        for (...)
        {
            ...
            MyWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                new Action(delegate()
                {
                    // Do something on the MyWindow thread.
                }
            ));
            ...
        }

        // Intensive loop now done and we close this processing window.
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
            new Action(delegate()
            {
                this.Close();
            }
        ));
    }; // ThreadStart

    new Thread(start).Start();
}

2 个答案:

答案 0 :(得分:4)

对我来说,它看起来并不干净...... 但除此之外,我认为没有理由不这样做。但是我也没有理由,因为没有使用BackgroundWorker:

private void BWDoWork(...)
{
    for (...)
    {
        // ...
        worker.ReportProgress(...);
    }
}

private void BWReportProgress(...)
{
    // do something on the MyWindow thread
}

private void BWCompleted(...)
{
    this.Close();
}

对我来说看起来更干净,因为你在线程和UI更新中完成的实际工作有点分离......

答案 1 :(得分:2)

这是好的,但有几点:

  • 你可能应该在Thread对象上设置IsBackground,这样它就不会导致应用程序在退出时挂起。
  • 如果这是一个短期运行的活动,那么你不应该创建一个新的线程,而是使用ThreadPool.QueueUserWorkItem或.NET4上的新“任务”。
  • 如果您的后台线程(池或手动创建)中存在未处理的异常,则应用程序将失败,您可以做很少的事情。 “任务”之类的事情处理得更好。

你并没有非常清楚地确定'有效'的资格,但是BackgroundWorker 通常是做这种事情的更好方法 - 如果不出意外,它将使用池线程,这很多比手动创建的线程便宜。