【问题标题】:How can I lock UI while running the long running process in the main UI Thread in WPF (code in C#)如何在 WPF 的主 UI 线程中运行长时间运行的进程时锁定 UI(C# 中的代码)
【发布时间】:2013-06-16 20:35:26
【问题描述】:

实际上,我无法在后台线程中运行长时间运行的进程。长时间运行的进程直接从 UI 获取输入,然后必须将任何修改保存在数据库中。因此,这个长时间运行的进程无法访问后台线程中的输入,尽管它被写入了 Dispatch 代码(如下所示):

  this.Dispatcher.Invoke((Action)(() =>
   {
       ...//The long running process inside background thread.
   }));

我的基本方法是防止用户在长时间运行的进程运行时点击其他任何地方。那么,有没有其他方法可以做到这一点?

【问题讨论】:

  • 如果不使用调度器会怎样... ui 线程会被锁定仪式?
  • 如何将所有数据从 UI 获取到某个数据存储类 - 调用时数据的快照并针对该数据编写逻辑。您将不再需要 UI,您可以在线程中执行。您的逻辑将返回适当的结果,然后在主线程中您只需显示它。同时,您的 UI 将响应显示一些进度条。它比无响应的应用程序更好。
  • @RameezAhmedSayad 如果我不使用调度程序并在主 UI 线程中编写长时间运行的进程,屏幕将变得无响应......
  • @Rafal 感谢您的建议...我会尝试的。
  • 如果你想显示一些进度,那么 Rafal 的回答很好......否则你可以在后台线程运行时将按钮的 enable 属性设置为 false 以禁用控件并稍后启用它.

标签: c# wpf user-interface disabled-input screen-lock


【解决方案1】:

我会这样做:

  • 为并发types 之一创建一个“全局”(UI 线程和后台线程)对象。您可以将其设为单例或将对象传递给两个线程
  • 长时间运行的线程所做的只是从并发对象中读取数据并进行处理。
  • 如果主线程(或任何其他线程)需要在后台执行任何操作,只需将其添加到并发集合中即可。

这种在并发编程中的做法叫做Producer-consumer problem

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多