1

私はC#.netの初心者です。ユーザースレッドからリストボックスにアクセスする単純なアプリがwpfにあります。winformsではinvokerequiredを使用できますが、ディスパッチャーを使用したwpfと同等のものは役に立ちませんでした。私のシステムもボタンのためにハングしているので、デバッグは可能です。以下のコードの解決策を提供してください。前もって感謝します

private void Monitor_mtd()
        {
                while (AppStatus != 0)
                {
                    if (flag2 == 1)
                    {
                        listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                            new list1MtdDelegate(list1Mtd), "Best practice");

                    }
               }
        }
        private delegate void list1MtdDelegate(string ls1);
        private void list1Mtd(string ls1)
        {
            listBox1.Items.Add(ls1);
        }


        private void button1_Click_1(object sender, RoutedEventArgs e)
        {
            Monitor = new Thread(new ThreadStart(Monitor_mtd));
            Monitor.Start();
            flag1 = 1;
        }
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            flag2 = 1;
        }
4

1 に答える 1

0

あなたのアプローチにはいくつかの問題があります。まず、データを ListBox にバインドする方法と、次にユーザー スレッドから ListBox を更新しようとする方法です。

UI が必要な値で更新されるように、ObservableCollection を使用して ListBox のバインドを解決できます (詳細については、この記事を参照してください)。ただし、これは別の問題も引き起こします。つまり、ObservableCollection は、ディスパッチしているスレッド以外の別のスレッドから呼び出すことができないということです (これについては、こちらも参照してください)。これは、ObservableCollection の別の実装が必要であることを意味します。Thomas Levesque は、任意のスレッドから変更でき、変更されたときに UI に通知できるAsyncObservableCollectionを作成しました。

ここからダウンロードできる完全なソリューションを示すサンプル実装を作成しました。

于 2012-10-19T11:08:39.063 に答える