【问题标题】:Reason why form won't go away quickly, possibly cause of await function?表单不会很快消失的原因,可能是等待功能的原因?
【发布时间】:2018-04-10 06:36:07
【问题描述】:

您好,我在代码中有以下内容:

await Task.Run(() => SomeLongRunningMethod());
if (dataGridViewExt1.Rows.Count > 0)
{
    Log.log("Bringing in items");
    BringItemsIntoSystem();
    this.Close();
}
else
{
    MessageBox.Show("No items to bring in", "Complete", MessageBoxButtons.OK, MessageBoxIcon.Information);
    Log.log("No items to bring in.");
    this.Close();
}

这是我的 BringItemsIntoSystem() 函数:

private void BringItemsIntoSystem()
        {
            try
            {
                for (int q = 0; q < dataGridViewExt1.Rows.Count; q++)
                {
                    Creator.Insert(0);
                    Creator.SetValueByName(0, "Lookup", dataGridViewExt1.Rows[q].Cells["LOOKUP"].Value.ToString());
                    Creator.SetValueByName(0, "Qty", dataGridViewExt1.Rows[q].Cells["Qty"].Value.ToString());
                    Creator.Commit(0);
                    Log.log("Item added: " + dataGridViewExt1.Rows[q].Cells["LOOKUP"].Value.ToString() + " with QTY: " + dataGridViewExt1.Rows[q].Cells["Qty"].Value.ToString());
                }
            }
            catch(Exception arr)
            {
                Log.log(arr.ToString());
                MessageBox.Show(arr.ToString());
            }
        }

这是我的 SomeLongRunningMethod():

public void SomeLongRunningMethod()
        {
            while (ContinueScanning != true)
            {
                Log.log("ContinueScanning is set to " + ContinueScanning.ToString());
                ReturnScannedItems();
            }
        }

等待函数运行并最终完成所述任务。 下面的代码继续执行......并且“BringItemsIntoSystem”可以相当快地执行并且没有问题并且可以满足它的需要。

现在,当它到达 this.Close()...关闭表单时非常困难。

我不完全确定还要寻找什么,因为 BringItemsIntoSystem 运行良好,完全没有问题。

await 函数是否会导致问题?有什么办法可以解决我在关闭表单时遇到的延迟问题吗?

查看 BringItemsIntoSystem 完成后没有问题的日志..正如您之后看到的那样,它应该正在执行: this.Close();

这不会立即发生这就是问题所在,我不确定如何描述它。

我创建了其他不使用“await Task.Run...”的项目,所以我认为它与此有关,但 BringItemsIntoSystem 工作正常,所以不知道如何证明。

我已经用一个简单的方法替换了我的 BringItemsIntoSystem() 函数:

MessageBox.Show("完成");

然而,这再次触发没有问题。

然后我添加了一个按钮,当我点击它时:

this.Close();

几乎就像表单 UI 处于活动状态...直到几秒钟后。

确认在表单再次激活之前有大约 15 秒的延迟,我可以点击复选框。

我希望这些新细节能帮助有人帮我解决这个问题。

感谢大家的帮助!

【问题讨论】:

  • “关闭表单非常困难”——这到底是什么意思?代码没有努力的概念。它要么可以做某事,要么不能。并不是你的代码不能做某事,而是在投入足够的努力之后,突然之间就可以了,但这正是“非常困难”的含义。请解决您的问题,以便它具有良好的minimal reproducible example 可以可靠地重现问题。 清楚地准确地说明该代码的作用,它与您希望它做的事情有何不同,以及具体您需要帮助弄清楚什么。
  • 如果您能花时间为我们创建一个minimal reproducible example,那就太棒了。您为此付出的努力将使我们解决它变得微不足道,或者您将在此过程中找出问题所在。现在你只是得到一个模糊的猜测作为唯一的答案。如果您想要一个正确的答案,请努力提出正确的问题。

标签: c# asynchronous async-await


【解决方案1】:

我认为等待的项目不会阻止在等待项目后执行关闭。我建议将每个项目注释掉,看看是什么阻止了它。

此外,这可能只是一个正常的关闭时间,具体取决于当时使用的资源。

关于异步主题的一个很好的参考,可能是一个很好的阅读。 When correctly use Task.Run and when just async-await

【讨论】:

  • 这不是问题的答案。问题的答案至少会尝试解释观察到的行为(而不是猜测)并提供问题作者可以实施的特定解决方案。以上纯属推测和推荐补充阅读,内容只适合评论,不适合回答。
  • 一开始我也认为这可能是正常的,但我注意到一个模式第一次出现了 2 次,它在 5 秒内关闭……第三次它实际上挂了很长时间。
  • @PeterDuniho 你是 100% 正确的,这更像是评论而不是任何答案。但是,我缺少 50 个代表点来回复评论,所以我选择了我可以使用的路线。
  • “我缺少 50 个代表点来回复评论” -- 不符合发表评论的要求绝不是滥用的借口Stack Overflow 系统通过发布不是答案的内容作为答案。
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2021-09-01
相关资源
最近更新 更多