2014-11-21 49 views
0

我正在使用C#中的用戶界面。當用戶點擊'開始'按鈕時,一個巨大的'for循環'開始工作。這個過程需要幾分鐘時間。程序運行時顯示信息消息

我希望在forloop之前顯示一條消息,並且在forloop之後消息將自動消失。我的目標是向用戶提供諸如「正在運行,請稍候」等信息。

有沒有辦法做到這一點?

這是循環。它掃描圖像並製作一些過程。

for (var i = 0; i <3504 ; i++) 
    for (var j = 0; j < 2306; j++) 
     { 
     ........ 
     } 
+1

使用[BackgroundWorker的](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx)。 – LarsTech 2014-11-21 00:16:40

+0

希望循環是線程? – BradleyDotNET 2014-11-21 00:19:45

+0

帶'IProgress'的'async Task'可能是'BackgroundWorker'的另一種選擇。 – Unflux 2014-11-21 00:28:00

回答

2

你沒有說你正在使用的GUI框架,所以我要去承擔形式。儘管WPF會相似。

讓我們假設您單擊名爲「button1」的按鈕後開始工作。創建一個Form子類,它是您的消息(爲了舉例,稱爲「MessageWaitForm」)。然後你可以使用它像這樣:

private void SomeWork() 
{ 
    for (var i = 0; i <3504 ; i++) 
     for (var j = 0; j < 2306; j++) 
      { 
      ........ 
      } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (MessageWaitForm form = new MessageWaitForm()) 
    { 
     form.Shown += async (sender1, e1) => 
     { 
      await Task.Run(() => SomeWork()); 
      form.Close(); 
     } 

     form.ShowDialog(); 
    } 
} 

這將導致在一個單獨的異步任務要執行的處理,一旦開始消息對話框中已被證明。任務完成後,執行將返回到form.Close()語句,從而允許消息窗體自動關閉。

請注意,我必須做一些假設並填寫代碼示例,以便可以提供可用的答案。以上內容可能與您現在的具體實施不符,但希望您能理解所闡述的基本概念並使其符合您的需求。

0

也許你的代碼看起來像這樣?我沒有機會編譯這個,但它應該足以讓你開始。

private void StartBtn_OnClick(object sender, EventArgs e) 
{ 
    _isRunning = true; 
    CodeIsRunning.Visibility = Visibility.Visible; 
    //Anything else needed (disable buttons, etc) 
    Task.Factory.StartNew(() => { 
     for (var i = 0; i < 3504; i++) 
      for (var j = 0; j < 2306; j++) 
      { 
       ... 
      } 
     _isRunning = false; 
    }); 
}