2013-05-02 79 views
0

所以我有一個使用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 (dr1 != DialogResult.OK & dr1 != DialogResult.Cancel) 
     { 
      //do stuff 
     } 

使用 「的Parallel.For」:

 Parallel.For(0, 1, i => 
     { 
     //do stuff 
     }); 

這失敗了,因爲我不知道如何讓它等待我點擊對話框。

使用此「Parallel While」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

爲什麼你在運行一個繁忙的循環呢?一旦你調用ShowDialog,你將暫停該線程的執行,直到ShowDialog返回(即關閉你的第二個表單。如果你希望這兩個表單都可見並且互動,只需調用'Show' – Thelonias 2013-05-03 12:04:29

回答

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 
    }); 
} 
+0

那麼我的一個問題是Parallel for我不知道如何控制它與表單輸入運行多長時間我相信如果我實現了你的建議,TotArea表單將不會負責循環運行的迭代長度 – 2013-05-02 21:17:33

+0

而且看起來好像這個建議等待用戶輸入之前運行循環我需要循環運行,直到用戶點擊確定或取消。 – 2013-05-02 21:24:40