gpt4 book ai didi

c# - 避免因锁定 WPF 而导致 UI 阻塞

转载 作者:太空宇宙 更新时间:2023-11-03 12:32:45 26 4
gpt4 key购买 nike

我有以下问题。我的软件可以访问通过 USB 连接的硬件。

在 UI 中有一些按钮(如搜索设备等)

并且您可以启动一个任务,该任务将锁定资源(USB 设备)并在后台线程上执行耗时操作。

问题是:如果在需要此资源的 GUI 中按下按钮,整个 UI 将被阻塞,直到耗时的后台线程完成(由于锁定)。

我有一些解决这个问题的想法,但似乎都有很多缺点。

到目前为止我的想法:

  • 使用 Monitor.TryEnter 检查资源是否可以访问。 ##缺点是这需要我更改所有 ICommand 实现(添加 if 语句)

  • 创建另一个 ICommand 实现,它有一个锁作为附加参数,并且仅在该锁空闲时才执行该方法(我希望将其作为预定义的 CanExecute 语句)。 ## 问题是,我不确定 CanExecute 的变化是否会被正确填充(我可以创建一个后台任务来定期检查资源是否空闲,但我认为这可能会导致竞争条件......)

我正在寻找如何解决这个问题的想法,如果这不是一个“建设性问题”,请随时标记它。

问候。

最佳答案

在您的 Execute() 中,您可以使用 Interlocked.CompareExchange() 在生成您的 worker 之前设置一个忙碌标志。

稍后在您的 CanExecute() 中简单地执行一个 Interlocked.Read() 来测试“忙碌”。

当您的工作人员完成时,只需执行另一个 Interlocked.Exchange() 即可清除忙碌标志。

Interlocked 类是线程安全的;相当快;并且上述模式不会阻塞您的 UI。

关于c# - 避免因锁定 WPF 而导致 UI 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42086497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com