3

次のコードを使用して、 TextBox.Textを更新して、1 秒の内部で 1 から 10 まで表示しようとしました。Thread.Sleep(1000)はDispatcher.BeginInvokeによって作成された別のバックグラウンド スレッドに属している必要があるため、テキストが 10 に更新される前に UI 全体が 10 秒間スリープする理由がわかりません。

コードの何が問題になっていますか?

Thread t1 = new Thread(new ThreadStart(
    delegate()
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
            new Action(delegate()
                {
                    for (int i = 1; i < 11; i++)
                    {
                        mytxt1.Text = "Counter is: " + i.ToString();
                        Thread.Sleep(1000);
                    }
                }));

    }));
t1.Start();
4

2 に答える 2

6

コードは、ディスパッチャーにアクションを UI スレッドに同期させるためだけに新しいスレッドを作成します。別のスレッドからのDispatcher.BeginInvoke変更が原因で例外が発生したため、追加したと思います。mytxt1.Textこれを試して:

Thread t1 = new Thread(new ThreadStart(
    delegate()
    {
        for (int i = 1; i < 11; i++)
        {        
            var counter = i; //for clouser it is important
            this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                new Action(delegate()
                {                    
                    mytxt1.Text = "Counter is: " + counter.ToString();                                         
                }));
           Thread.Sleep(1000);
        }
    }
于 2012-12-14T08:12:25.437 に答える
2

テキストを設定するアクションが UI スレッドで実行されているため、UI がフリーズしています。

UI コントロールのインスタンスを作成したスレッド (別名 UI スレッド) のみが UI コントロールのプロパティを変更できるという制限があるため、UI スレッドでテキストを設定するコードを実行する必要があります。そして、それがあなたがしていることです。

あなたが試すことができるのは、そのコードを Threading.Timer で実行することです。

または...既に持っているコードを使用すると、次のようなものが必要になり、機能する可能性があります。

Thread t1 = new Thread(new ThreadStart(
delegate()
{
    for (int i = 1; i < 11; i++)
    {
    this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
        new Action(delegate()
            {                        
                    mytxt1.Text = "Counter is: " + i.ToString();                           

            }));
     Thread.Sleep(1000);
     }             
}));
t1.Start();
于 2012-12-14T08:09:49.323 に答える