调用线程adn的WPF奇怪行为来更新进度条

时间:2015-12-28 11:51:49

标签: c# wpf multithreading ienumerable invoke

我有一个方法从数据库中读取并使用yield返回逐个返回结果项。我在foreach循环中调用它,并在每次迭代时调用STA thread进行更新ProgressBar。在这种情况下,对于某些参数,我大约需要6秒钟。但是如果我删除Invoke,那么相同的参数我得到28秒。我在单独的应用程序中测试此行为,并且可以说Invoke每次迭代到主线程处理的速度要慢10倍。但是,Invoke在我的应用程序中比其他已完成的示例中的要快6倍 (不慢)!

有什么建议吗?

一般来说,它看起来像这样:

Thread thread = new Thread(() =>
{
    int itemNumber = 0;
    foreach (object item in SelectItems())
    {
        itemNumber++;

        // doing some staff ...

        Application.Current.Dispatcher.Invoke(
            new Action(() =>
            {
                ProgressBar1.Value = itemNumber * 100 / count;
            }),
            null);
    }
});
thread.IsBackground = true;
thread.Start();

更新

我想我需要说这是一个很大的应用程序,并且有大约半百个后台线程。而且我认为它们不能同时发挥作用。

0 个答案:

没有答案