首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台执行OnClick代码时禁用Winforms按钮

在后台执行OnClick代码时禁用Winforms按钮
EN

Stack Overflow用户
提问于 2014-02-05 19:08:19
回答 3查看 3.7K关注 0票数 2

我的"button_click“操作中有一些代码。我想在此代码工作期间禁用该按钮。

代码语言:javascript
复制
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        button1.IsEnabled = false;
        // some code (its take about 2-5 sec)
        button1.IsEnabled = true;
    }

但这不管用。这个按钮永不停用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-05 19:10:44

您需要在后台线程上运行“一些代码”部分:

代码语言:javascript
复制
button1.Enabled = false;
Task.Factory.StartNew(() => {
    // some code (its take about 2-5 sec)
}).ContinueWith(task => {
    button1.Enabled = true;
}, TaskScheduler.FromCurrentSynchronizationContext());
票数 4
EN

Stack Overflow用户

发布于 2014-02-05 19:10:30

这是因为您的UI在整个操作期间锁定。

您应该在某种背景线程中编写任务。

您可以为此使用BackgroundWorker,但最好是使用Task

代码语言:javascript
复制
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += bgw_DoWork;
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;

button.Enabled = false;

bgw.RunWorkerAsync();

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
   // your task
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // update the button
    button.Enabled = true;
}
票数 2
EN

Stack Overflow用户

发布于 2014-02-05 19:31:51

Dispatcher负责WPF中的消息抽取。每个线程都有与其相关联的调度程序,它负责根据项目的DispatcherPriority对该线程上的内容进行排队。

在您的示例中,GUI呈现是在DispatcherPriority.Render上完成的,但是现在dispatcher正在忙着执行您的按钮,单击事件处理程序代码,所以在代码执行完成之前,GUI呈现永远不会发生。这就是为什么只有在完全执行处理程序时才会看到按钮被刷新的原因。

在sidenote上,McGarnagle提议的内容将起作用,但您也可以通过显式地将调度程序上的空委托与优先级Render排队,这将迫使优先级更高或等于的所有排队项在进一步处理之前进行呈现。因此,您将在GUI上看到刷新:

代码语言:javascript
复制
button1.IsEnabled = false;
Application.Current.Dispatcher.Invoke((Action)(() => { }),
                                       DispatcherPriority.Render);
// some code (its take about 2-5 sec)
button1.IsEnabled = true;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21586288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档