【问题标题】:c# await Task.Run dialog box hidden behind my WPF app main formc# await Task.Run 对话框隐藏在我的 WPF 应用程序主窗体后面
【发布时间】:2020-06-10 17:34:46
【问题描述】:

我有一个 WPF Saraff.Twain 扫描应用程序。选择我拥有的数据源:

private async void selectButton_Click_1(object sender, EventArgs e)
{
    try
    {
        this.EnabledIO = false; //disable some controls
        await Task.Run(() => this._twain32.SelectSource());
    } ...
}

twain32.SelectSource 显示选择数据源的对话框,但对话框出现在主窗体后面。

当它尝试从数据源获取图像时也会发生这种情况:

private async void acquireButton_Click_1(object sender, EventArgs e)
{
   try
    {
        this.EnabledIO = false; //disable some controls
        await Task.Run(() => this._twain32.Acquire());

        _twain32.CloseDSM();
    } ...
}

有没有办法把对话框放到前面?我尝试过了 最小化然后最大化主窗体,但如果有另一个应用程序正在运行,它无论如何都会显示在它们后面。这让用户非常困惑,因为看起来应用程序被卡住了,即使任务栏显示还有另一个窗口在等待输入。

非常感谢,请原谅我在这里发帖缺乏经验。

【问题讨论】:

  • 不使用Task.Run时表单会怎样?也在主窗体后面?
  • 我没有尝试过......我认为 Task.Run 根据 Saraff.Twain 样本是必要的,我猜。我的意思是在主窗体或窗口的“后面”停留在前面...我必须移动它才能看到对话框
  • 试试看。之所以有必要,是因为它会阻塞您的 UI 线程并使其无响应,但这没关系,因为您需要确定它是否是导致问题的后台线程。
  • 如果无法查看 _twain32 方法的代码,这可能很难解决。
  • 处理这个问题的正常方法是为新对话框提供创建对话框的父窗口的句柄。在某些情况下,这是通过选择线程的根窗口自动完成的,但这需要代码在 UI 线程上运行。如果两者都不可能,这似乎是库的问题,因此您可能需要联系提供商以获得支持。

标签: c# wpf async-await


【解决方案1】:

不要无缘无故地使用Task.Run 方法。它仅在您想要在不阻塞 UI 的情况下进行后台工作时有用。后台工作不应与 UI 交互。在您的情况下,_twain32.SelectSource 方法显然包含 UI 相关代码,因此您应该直接调用它:

private async void selectButton_Click_1(object sender, EventArgs e)
{
    try
    {
        this.EnabledIO = false; //disable some controls
        this._twain32.SelectSource();
    }
}

如果这使您的应用程序的 UI 无响应,那么您俩都有麻烦了。你是因为你(可能)必须寻找更好的图书馆,图书馆的创建者是因为他们(可能)会失去一个客户。

【讨论】:

  • 确实没有必要使用 task.run,因为没有它,对话框的工作方式相同,但仍然存在问题,现在应用程序没有响应,我猜你是正确的,它是图书馆问题谢谢。一旦我知道如何,我会支持@JohanP 评论
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多