c# - WPF C# 锁定/解锁按钮并执行线程

标签 c# wpf multithreading button

有人可以帮我理解为什么这段代码不起作用吗?

我想做的是:点击按钮,更改按钮内容并锁定它,执行外部线程,最后解锁按钮并再次更改内容

private void button3_Click(object sender, RoutedEventArgs e)
{
    button3.Content = "Printing...";
    button3.IsEnabled = false;

    Thread.Sleep(1000);

    button3.IsEnabled = true;
    button3.Content = "Print";
}

最佳答案

您看到此行为的原因是您的方法(处理按钮的 Click 事件)与 UI 在同一线程上运行。这个概念是使用 UI 代码时常见的问题根源。

简单地说,在您的方法完成之前,无法重新绘制 UI。在该方法中,您禁用按钮,等待 1 秒钟,然后重新启用按钮 - 然后 UI 将重新绘制,按钮启用。因此,您永远不会在屏幕上看到禁用的按钮(并且在 sleep 发生时您的应用程序将卡住 1 秒)。

您需要做的是研究可用于在后台线程上运行任务的方法之一。您的方法应该创建并启动该线程,将按钮设置为禁用,然后完成 - 允许 UI 线程将按钮绘制为禁用。任务完成后,您应该再次将按钮设置为启用(请注意,通常在 WPF 中,这意味着使用 Dispatcher.Invoke 来确保从 button.Enabled 设置UI 线程)。

要创建后台任务,您可以查看 System.Threading 命名空间(特别是 Thread.Start 方法)或 Task Parallel Library ,或 BackgroundWorker类(class)。我怀疑 TPL 将是您最简单的起点。

关于c# - WPF C# 锁定/解锁按钮并执行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19766029/

相关文章:

c# - 克隆网络服务最简单的方法是什么?

c# - 如果 C# 中的列包含偶数,如何删除 SQL 表中的行?

c# - View 的创建应该是 View 或 ViewModel [MVVM] 的一部分?

c# - 在工作线程中创建对象并绑定(bind)到它们

c# - 谁将 BeginInvoke、Invoke 和 EndInvoke 方法定义添加到类型化委托(delegate)中?

c# - 如何使用未知类型的 AS 关键字

c# - WebAPI 的 WPF 客户端 - 如何处理身份验证密码

python - 在 Python 中使用 Multiprocessing+Threads 加速应用程序时遇到问题

multithreading - 互斥体与信号量中的优先级反转

java - 如何访问自定义线程池执行器方法中的线程对象?