2010-10-21 51 views
0

我在主窗體上顯示對話框,現在一個for循環正在工作後面,但是當該對話框將顯示代碼執行將停止,但我不想讓停止代碼的執行,是任何其他任何方式要做到這一點 ?Dialog停止執行代碼,是否有任何方式阻止它在C#中?

編輯:我現在使用的線程來做到這一點,我的代碼是一樣

Thread t; 
    private void StartParsingByLoop() 
    { 
     t = new Thread(new ThreadStart(RunProgress)); 
     t.Start(); 
     for (int i = 0; i < dialog.FileNames.Length; i++) 
     { 
      cNoteToParsed.AllContrctNotesFilePath.Add(dialog.FileNames[i].ToString()); 
     } 
      cNoteToParsed.ParseContractNote(); 
      if (cNoteToParsed.NOfContrctNoteParsed > 0) 
       LoadTransactionsInDataGridView(); 
      t.Abort(); 
    } 

    private void RunProgress() 
    { 
     frmProgress progressForImportingTran = new frmProgress("Importing Transactions", "ok"); 
     progressForImportingTran.ShowDialog(); 
    } 

現在我的問題是,顯示進度對話框不會表現得像對話框,並給出了主要形式的訪問如果我們嘗試訪問主窗體,那麼對話框將隱藏。我不想讓對話被隱藏起來。

+0

發佈一些代碼。 – 2010-10-21 10:27:48

回答

1

您可以讓不同的thread處理循環。

響應編輯:你能提供更多的細節,也許有些代碼?循環在做什麼?你顯示什麼樣的表格?

1

(這個答案是基於我們正在採取有關WinForms應用程序的假設)

使用Show方法,而不是ShowDialog顯示形式。通過傳遞一個參考的主要形式,對話框將留在主窗體的頂部,即使它不是模態:

TheDialog dialog = new TheDialog(); 
dialog.Show(this); 

不過要注意的是,用戶仍然可以與主窗體上的控件進行交互,所以您可能需要禁用某些控件,具體取決於您的場景。

您在您的問題中聲明有一些要求阻止您使用線程進行此操作。這種要求讓我覺得很奇怪,而且很遺憾,因爲這是您想要使用某種異步構造的典型場景之一。通過在UI線程上執行繁重的工作,你會得到一些缺點,包括:

  • ,UI將不響應 - 如果你希望允許用戶通過點擊一個按鈕來取消工作,這將是棘手的方式來實現一個強大的方式。
  • 由於UI線程忙於執行其他工作,UI將不會正確重繪
+0

我想以模態方式拍攝該表單,因爲它顯示了一些對用戶有用的進程。 – Harikrishna 2010-10-21 09:51:14

+0

@Harikrishna:那麼這種方法對你來說應該會很好,即使你可能遇到UI沒有正確更新的問題,因爲這是由執行工作的同一線程處理的。某種異步模型(線程/線程池,後臺工作者)真的是這種情況下的方式。 – 2010-10-21 09:51:45

+0

無法使用線程或後臺工作人員以模態方式顯示顯示錶單嗎? – Harikrishna 2010-10-21 09:58:56

0

不要使用ShowDialog()而是使用Show()來顯示對話窗口。 Show()將立即返回給調用者,而ShowDialog()將執行。請注意,使用Show()時,您的對話框將不再是模態。

+0

我想以模態方式拍攝該表單,因爲它顯示了一些對用戶有用的進程。 – Harikrishna 2010-10-21 09:49:29

0

好的,所以你不需要模態對話框,你需要一個機制讓你的用戶在啓用處理時不能選擇你的主窗體。

模態對話框並不意味着執行停止 - 它只發生在別的地方。

有幾種方法可以做到這一點,你排除了新的線程創建(不知道爲什麼,它會優雅地解決它)。如果不使用線程,您將遇到另一個問題 - 您的處理應該在CHUNKS中完成,而且每過一段時間,您都必須執行類似於Application.DoEvents()的操作,以使您的應用程序能夠處理消息並且不會被凍結給用戶。

所以,如果你能在主窗體顯示你的「請稍候」對話框,將執行一些工作,後來做一些更長時間,直到完成後,你可以做到這一點創建一個方法:

  • 創建一種新的形式(等待對話框)
  • 啓動一個計時器的它和電線計時器到母體形式內
  • 定時器間隔應爲1
  • ShowDialog()形式
  • 上定時器事件做小摩沒有工作(不要讓它超過1/10秒)

你能做到嗎?

總之:

  • 任務不能被分裂成小碎片可行
  • 你不能使用線程
  • 你希望你的用戶界面響應

選擇2。你不能在Winforms中擁有全部3個。