在执行其他操作之前,如何在按钮处理程序中重置WPF中的文本框?

在执行其他操作之前,如何在按钮处理程序中重置WPF中的文本框?,wpf,multithreading,asynchronous,wpf-controls,dispatcher,Wpf,Multithreading,Asynchronous,Wpf Controls,Dispatcher,我的WPF应用程序中有一个简单的WPF按钮和一个文本框(根本不使用MVC或绑定)。单击按钮后,我希望能够执行以下操作: 1) 清除文本框 2) 创建结果 3) 将结果分配给文本框 我使用了Textbox.Clear、Textbox.Text=String.Empty、委托和类似的分派器方法 private void button_Click(object sender, RoutedEventArgs e) { Application.Current.Dispatcher

我的WPF应用程序中有一个简单的WPF按钮和一个文本框(根本不使用MVC或绑定)。单击按钮后,我希望能够执行以下操作:

1) 清除文本框

2) 创建结果

3) 将结果分配给文本框

我使用了Textbox.Clear、Textbox.Text=String.Empty、委托和类似的分派器方法

private void button_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.Dispatcher.BeginInvoke(new Action (ClearReportTxtBox), DispatcherPriority.Send);
        System.Threading.Thread.Sleep(5000);
        runTest();
    }


private void ClearReportTxtBox()
    {
        Report_textBox.Text = string.Empty;
    }
没有一个对我来说工作正常。dispatcher方法在某种程度上起了作用,但并不像我希望的那样。似乎清除任务将排队,当按钮单击处理程序中的所有操作完成时,它将开始运行并删除文本框,但这将导致生成的报告以及已分配给文本框(由上面代码中的runtest创建)的报告也将被删除。因此,删除操作并消除整个结果为时已晚

目前,在我看来,通过单击按钮,UIthread将阻塞并获得控制权。完成按钮单击后,调度程序将删除操作作为下一个操作排队

是否可以在开始时强制删除,然后执行其余操作?我想要达到的是暂停按钮活动,并在第一个操作时删除,然后在按钮处理程序中继续其余操作

我做错什么了吗

提前感谢您的帮助。

对于您想做的事情,“Dispatcher.BeginInvoke”有点奇怪

所有UI更新都必须在主线程上完成。由于“Button_click”事件正在主线程上执行,因此您推入Dispatcher的委托只能在Button_click句柄完成后执行。这就是为什么执行序列变得 1.GUI冻结,因为线程。睡眠 2.运行测试 3.ClearReportTextBox

我想你可以试试下面这样的东西

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {            
        ClearReportTxtBox();

        Task.Factory.StartNew(RunTest);
    }

    private void ClearReportTxtBox()
    {
        MyTextBox.Text = string.Empty;
    }

    private void RunTest()
    {
        System.Threading.Thread.Sleep(5000);

        if (dispatcher != null && !dispatcher.CheckAccess())
        {
            dispatcher.Invoke(priority, ()=> MyTextBox.Text = "123");
        }
        else
        {
            MyTextBox.Text = "123";
        }                
    }

异步操作的意义是什么?你就不能清除按钮处理程序中的文本框吗?这里让我困惑的是“创建结果”。在你的代码中,你在做什么,这一步到底在做什么?如果要为文本框指定其他内容,则只需执行该操作,而不是清除文本框,然后将其设置为其他内容。如果文本框是某种密集型过程,您可以在此期间禁用它。如果您确实需要运行异步的东西,您可以改用TPL任务吗?通过单击按钮,dispatcher就是您正在运行的线程。这一切的意义是什么。只需清除文本框和单击事件上的所有其他内容。我想在开始时重置(清除)文本框。问题是,如果文本框中有某种结果,通过(重新)单击按钮,它不会立即重置文本框,并且在按钮中的所有活动完成之前仍显示旧结果。感谢您的回复,但通过执行您的建议,出现了一个异常。新线程无法访问文本框,因为它似乎属于其他线程。