簡體   English   中英

用戶界面仍然使用backgroundWorker凍結

[英]UI still freezes using backgroundWorker

我對WPF很陌生。 我正在開發PRISM應用程序,並希望在更新枚舉時更新UI。 我在modelView中使用backgroundWorker更新了枚舉。 一切正常,直到它自身的枚舉被更新,然后UI凍結! 一位朋友告訴我,我也許可以使用yield關鍵字,但我不太清楚。

這是代碼:

public void ChangeCollection()
    {
        BackgroundWorker worker = new BackgroundWorker();

        // Set workers job
        worker.DoWork += (sender, e) =>
            {
                RunOnUIThread(() => IsBusy = true);
                e.Result = GetPrimes();
            };

        // On Complete
        worker.RunWorkerCompleted += (sender, e) =>
            {
                RunOnUIThread(() =>
                    {
                        IsBusy = false;

                        // HERE IS WHERE IT GETS STUCK
                        Numbers = new ObservableCollection<int>
                            ((IEnumerable<int>)e.Result);
                    });
            };

        // Start background operation
        worker.RunWorkerAsync();
    } 

    public ObservableCollection<int> Numbers 
    { 
        get {return _Numbers;} 
        set
        {
            _Numbers = value;
            RaisePropertyChanged(() => Numbers);
        }
    }

    public IEnumerable<int> GetPrimes()
    {
        List<int> primes = new List<int>();

        for (int i = 0; i < 100000; i++)
        {
            bool IsPrime = true;

            for (int j = 2; j < i; j++)
            {
                if (i % j == 0)
                    IsPrime = false;
            }

            if (IsPrime)
                primes.Add(i);
        }

        return primes;
    } 

任何建議將不勝感激!

謝謝Omri

yield不會在這里幫助您。 RunWorkerCompleted在UI線程上執行。 顯然實例化ObservableCollection<int>花費很長時間。 最簡單的解決方案可能是將實例也移動到后台線程( DoWork )。 它也可能是花費很長時間的PropertyChanged事件處理程序,在這種情況下,它也應該在后台線程上運行。

這里有幾件事。 1)實例化包含它的對象時,應創建您的工作程序及其委托。

public class ViewModel 
{
    BackgroundWorker _primeWorker;

    public ViewModel()
    {
        _primeWorker = new BackgroundWorker;

        _primeWorker.DoWork += ...
    }

    public void AddSomeNumbers()
    {
         if(_primerWorker.IsBusy == false)
              _primeWorker.RunWorkerAsync();
    }
}

2)當實例化包含它的對象時,應該實例化您的集合,以避免使用該類的對象調用get引發null異常。

3)添加許多項會導致速度變慢,這是因為每次添加數字都會觸發UI線程必須處理的事件。

此鏈接有更多信息可以幫助您。 http://msdn.microsoft.com/zh-CN/library/cc221403(v=vs.95).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM