所以我有一个使用Google地球的应用程序。我点击一个按钮弹出一个新表格。当用户在主表单中点击Google地球上的地点时,此表单仍然保留。弹出此表单后,将运行一个循环,等待用户单击“确定”或“取消”。目前,当弹出窗口时,我无法与主要的Google地球表单进行任何用户交互。
我甚至不确定接近它的最佳方式,因此很难找到相关的东西。
这是我到目前为止所尝试的内容:
这是按下按钮后代码的第一部分,这对于以下所有内容都是通用的:
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”:
Parallel.For(0, 1, i =>
{
//do stuff
});
此操作失败,因为我不知道如何让它等待我单击对话框。
使用此“并行时”http://blogs.msdn.com/b/pfxteam/archive/2009/08/12/9867246.aspx: ParallelOptions paralleloptions = new ParallelOptions();
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());
}
这对我来说是完全陌生的,它似乎运行得那么快,以至于它根本不是真正的并行。
有人可以在这里提出任何建议吗?
感谢。
答案 0 :(得分:1)
ShowDialog应暂停执行,直到返回对话框结果。因为您在单独的线程中显示对话框,所以它不会暂停您当前的对话框。
您可以返回使用Parallel.For,只需将代码更改为:
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
});
}