首页 > 解决方案 > c# await Task.Run 对话框隐藏在我的 WPF 应用程序主窗体后面

问题描述

我有一个 WPFSaraff.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();
    } ...
}

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

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

标签: c#wpfasync-await

解决方案


不要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 无响应,那么您俩都有麻烦。你是因为你(可能)必须寻找一个更好的图书馆,图书馆的创建者是因为他们(可能)会失去一个客户。


推荐阅读