并行线程?循环
本文关键字:循环 线程 并行 | 更新日期: 2023-09-27 18:11:48
我有一个使用Google Earth的应用程序。我点击一个按钮,就会弹出一个新表单。当用户在主表单中单击Google earth上的位置时,此表单保持在显示状态。在此表单弹出后,将运行一个循环,等待用户单击"确定"或"取消"。目前,我不能得到任何用户交互与主要的谷歌地球形式,而弹出是有。
我甚至不确定最好的方法来接近它,所以很难搜索相关的东西。
以下是我到目前为止所做的尝试:
这是按钮被按下后代码的第一部分,下面的代码都是相同的:
Form TotArea = new ASPE.GUI.OptimizationWizard.TotalArea();
DialogResult dr1 = new DialogResult();
Thread t = new Thread(() => dr1 = TotArea.ShowDialog());
t.Start();
//TotArea.TopMost = true;
bool firstcall = true;
dynamic[] polystuff = null;
在对话框弹出后简单地运行一个while循环(我知道这会失败):
while (dr1 != DialogResult.OK & dr1 != DialogResult.Cancel)
{
//do stuff
}
使用"平行。":
Parallel.For(0, 1, i =>
{
//do stuff
});
这个失败是因为我不知道如何让它等待我点击对话框。
使用这个"Parallel While" http://blogs.msdn.com/b/pfxteam/archive/2009/08/12/9867246.aspx:
Func<bool> condn = () => (dr1 != DialogResult.OK | dr1 != DialogResult.Cancel);
Action whilebody = () =>
{
//do stuff
};
这些函数:
While(paralleloptions, condn, whilebody);
private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
public static void While(
ParallelOptions parallelOptions, Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), parallelOptions,
ignored => body());
}
这对我来说是完全陌生的,它似乎运行得如此之快,以至于它根本不是并行的。
有谁能给点建议吗?
谢谢。
ShowDialog应该停止执行,直到返回一个对话框结果。因为你在一个单独的线程中显示对话框,所以它不会停止当前的线程。
你可以回到使用Parallel。把你的代码改成这样:
if (DialogResult.OK == TotArea.ShowDialog())
{
Parallel.For(0, 1, i =>
{
//do stuff
});
}
你也可以使用Task。如果你必须在后台执行,则设置为Factory:
var task = Task.Factory.StartNew(() => { return TotArea.ShowDialog(); });
task.Wait();
if (task.Result == DialogResult.OK)
{
Parallel.For(0, 1, i =>
{
//do stuff
});
}