【发布时间】:2020-01-25 23:20:26
【问题描述】:
我尝试为我正在运行的算法创建一个简单的步进模式,如下所示:
public async Task<bool> AStarAlgorithmAsync(PFSquare curr = null)
{
// some algorithm code here
foreach(var square in Sorroundings)
{
if (SteppedMode)
{
await Task.Run(Pause);
}
if (await AStarAlgorithmAsync(square))
{
return true;
}
}
}
在我的应用程序中,我有一个名为 SteppedMode 的布尔值,它决定算法是否应在每次点击事件时运行一次迭代。
Pause() 看起来像这样:
private void Pause()
{
while (!ContinueStep) { }
ContinueStep = false;
return;
}
在我的 (GUI) 应用程序的另一部分中,我有一个事件将布尔值 ContinueStep 设置为 true,理论上应该结束 while 循环并继续算法函数。目前这段代码锁定了我的 GUI 线程,我几乎可以肯定有更好的方法来做到这一点。
我试图让我的算法函数运行一次迭代,等待用户点击,然后才继续运行算法。有没有更简单、更清洁的方法来做到这一点?
(这是一个 GUI 应用程序,而不是控制台应用程序。)
【问题讨论】:
-
不要将
SteppedModeboolean 放在你的算法中,不如将步进模式算法编写为一个单独的函数呢?那么自动算法将简单地一遍又一遍地调用这个阶梯函数直到结束。 -
我不明白为什么您发布的代码会从字面上锁定 GUI 线程。它会消耗大部分 CPU 时间,这会大大减慢速度。但不能完全锁定。也就是说,您可以使用
TaskCompletionSource<T>,而不是等待轮询方法返回。请参阅标记的重复项。 -
@PeterDuniho 这个问题并不是真正的重复。我认为 OP 陷入了困境并试图解决错误的问题
-
@M.kazemAkhgary 好主意,我想我会试试的。
-
@PeterDuniho “问题通常需要先关闭,然后再改进。” 但不适合重复关闭(对于“需要重点”关闭,我完全同意)。假设知道(现有的)解决方案然后对(据称)改变为完全不同的问题持开放态度是没有意义的。这实际上违反了 SO 社区标准,因为此类更改需要作为一个完全独立的问题发布。
标签: c# asynchronous