【问题标题】:Execute simple Logic without "locking" the UI在不“锁定”用户界面的情况下执行简单的逻辑
【发布时间】:2015-06-19 08:20:00
【问题描述】:

我有一个带有一些 txb 和一个按钮的对话框。单击此按钮时,我想更改按钮的文本,禁用按钮,启动一些逻辑,然后关闭窗口。

该逻辑没有返回值,它只是设置了一个静态变量。但它可能需要一分钟,因为它连接到数据库。

如何阻止 WinFroms UI 冻结?我正在寻找一种简单的方法,如果可能的话没有新的类和文件。

【问题讨论】:

  • BackgroundWorker 也许?
  • 上个赛季后台工作人员如此之多,存在更好的技术,但为什么不呢。
  • 大多数(全部?)数据库提供者都支持某种形式的异步编程。你应该检查一下。
  • @Andrew 我通过一个从接口获取数据的类访问数据库/数据源。有点复杂,但我不仅从数据库中获取数据。如果不确定每个实现都支持异步,我将不得不对代码进行大的重构。

标签: c# winforms


【解决方案1】:

我会这样做:

private async void ButtonClick() 
{
    //here, you're on the UI Thread
    button1.Enabled = false;

    await Task.Run(() => DoTheWork());

    //you're back on the UI Thread
    button1.Enabled = true;
}

private void DoTheWork() 
{
    //this will be executed on a different Thread
}

【讨论】:

  • 感谢 M.kazemAkhbary 解决方案的替代方案:D
  • 好吧。事实上,我并不知道这种方式。在我自己的项目中使用你的方式!谢谢 !这实际上更好。使用这种方式@LukasDörig
  • 确实,看起来很干净简洁。
【解决方案2】:

您可以使用后台工作人员:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = false;
worker.WorkerReportsProgress = false;

worker.DoWork += (s, e) =>
    {
        //perform action
    };

worker.RunWorkerCompleted += (s, e) =>
    {
        //close window
    };

worker.RunWorkerAsync();

更多详情请见this

【讨论】:

  • 我们有 TPL/await/async/等。我建议使用任务。
【解决方案3】:

当按钮被点击时:

button.Enabled = false;
button.Text = "new text";
Task.Factory.StartNew(() =>
{
    // do your tasks here and close the window.
    // type your code normally like calling methods. setting variables etc...

    StaticVariable = ExampleUsingMethod();
});

如果您的变量需要稍后分配给 UI,那么您需要调度程序。例如,如果您想在新线程中更改按钮。

Task.Factory.StartNew(() =>
{
       Dispatcher.Invoke(() => 
       {
          button.Enabled = false;
          button.Text = "new text";
       }

       StaticVariable = ExampleUsingMethod();
});

【讨论】:

  • 我会使用等待/异步而不是调度程序。
  • 您可以通过这种方式进行更好的管理,但我尽量让 OP 要求的内容保持简单。 @安德鲁
  • @M.kazemAkhgary 感谢您保持简单:D
  • 我建议你更喜欢 Task.RunTask.Factory.StartNewavoid some traps
【解决方案4】:

您可以使用thread 来执行计算。 这可能会有所帮助:Threads in CSharp

【讨论】:

  • 这里指的是 2003 年的文章。12 年后会有更好的来源,真的。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2011-03-06
  • 2010-09-11
  • 2018-08-25
  • 1970-01-01
相关资源
最近更新 更多