3

我尝试使用以下代码更新TextBox.Text以显示从 1 到 10,内部时间为 1 秒。我不明白为什么整个 UI 在文本更新到 10 之前会休眠 10 秒,因为我认为Thread.Sleep(1000)应该属于Dispatcher.BeginInvoke创建的单独后台线程。

我的代码有什么问题?

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 回答