2

私は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;
    } 

どんなアドバイスでも大歓迎です!

ありがとう、オムリ

4

2 に答える 2

0

ここにいくつかのことがあります。1)ワーカーとそのデリゲートは、それを含むオブジェクトがインスタンス化されたときに作成する必要があります。

public class ViewModel 
{
    BackgroundWorker _primeWorker;

    public ViewModel()
    {
        _primeWorker = new BackgroundWorker;

        _primeWorker.DoWork += ...
    }

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

2)コレクションを含むオブジェクトがインスタンス化されるときにコレクションをインスタンス化して、このクラスを使用するオブジェクトが。を呼び出した場合にnull例外がスローされないようにする必要がありますget

3)多数のアイテムを追加すると、番号を追加するたびにUIスレッドが処理する必要のあるイベントが発生するため、速度が低下します。

このリンクには、あなたを助けるためのより多くの情報があります。http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

于 2013-01-25T17:12:23.627 に答える
0

yieldここでは役に立ちません。RunWorkerCompletedUI スレッドで実行されます。のインスタンス化にObservableCollection<int>時間がかかっているようです。最も簡単な解決策は、インスタンス化をバックグラウンド スレッド ( DoWork) にも移動することです。PropertyChangedまた、時間がかかるイベント ハンドラーである可能性もあります。その場合は、バックグラウンド スレッドでも実行する必要があります。

于 2013-01-25T17:05:21.700 に答える