【发布时间】: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