2017-05-06 54 views
0

我的程序停止工作時,它進入for循環我解決了它白色Application.DoEvents();但它真的放慢了程序,我該如何解決它?C#windows應用程序停止工作時啓動大for循環過程

for (int b = 10011000; b < 99999999; b++) 
     { 
      //code 

      if (//condition) 
      { 



       try 
       { 
     /////// 

       } 


       catch 
       { 
      ////// 
       } 
      } 
      else 
      { 
     ////// 
      } 
      Application.DoEvents(); 

     } 
+1

在Windows窗體中,你可以使用'BackgroundWorker'做後臺任務而不阻塞UI。 –

+0

不要忘記接受我的回答;-) –

+1

'已停止工作'是因爲主窗口的消息隊列未處理。這是因爲gui線程正在執行for循環。像@ AlessandroD'Andria說的那樣,使用[BackgroundWorker msdn](https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v = vs.110).aspx#Examples)。或[BackgroundWorker教程](https://www.dotnetperls。com/backgroundworker) –

回答

1

好吧,使用Application.DoEvents()永遠不是最好的辦法。

我建議把你的循環放在它自己的函數中,然後在它自己的線程上調用它。這樣,UI線程將保持獨立運行,而你的循環就是這樣做的。還有其他方法可以實現這一點,如使用TasksCallBacksasync方法,如果您想做一點研究並決定哪種方法最適合您的情況。

事情是這樣的:

Thread backgroundThread = new Thread(()=>myLoopMethod)); 
backgroundThread.Start(); 

或者:

Task myLoop = new Task(() => myLoopMethod)); 
myLoop.Start(); 

雖然我沒有在時刻訪問一個IDE檢查語法。

+0

tnx很多我會這樣做 其實我不需要用戶界面後,它開始太過程我只是想讓程序做它的工作 –

+0

它已完成工作,但它也很慢 –

1

這是一個非常密集的循環,你在那裏。爲什麼不使用async模型呢?

當使用此DoEvents時,MSDN還會投標caution

而你的情況似乎是一個很好的選擇,可以異步執行。

0

您需要在其他線程或任務

像這樣運行:通過這個代碼

Task task = new Task(() => { /* your code */ }); 
task.Start(); 

你的應用永遠不會停止,但不要忘了在UI參數改變你需要調用

this.Invoke(new Action(() => { /*your code*/ })); 

更多信息看這個鏈接:

https://www.dotnetperls.com/async

https://www.codeproject.com/Articles/189374/The-Basics-of-Task-Parallelism-via-C

更新

和加速你的代碼是很好用的Parallel.For。 whach此鏈接

http://www.dotnetcurry.com/csharp/608/csharp-parallel-for-loop-method`

using System; 
using System.Threading; 
using System.Threading.Tasks; 

namespace ParallelFor 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Using C# For Loop \n"); 

     for(int i=0; i <=10; i++){ 
      Console.WriteLine("i = {0}, thread = {1}", 
       i, Thread.CurrentThread.ManagedThreadId); 
      Thread.Sleep(10); 
     } 

     Console.WriteLine("\nUsing Parallel.For \n"); 

     Parallel.For(0, 10, i => 
     { 
      Console.WriteLine("i = {0}, thread = {1}", i, 
      Thread.CurrentThread.ManagedThreadId); 
      Thread.Sleep(10); 
     }); 

     Console.ReadLine(); 
    } 
} 
}` 
+0

tnx它已完成工作,但它是真的很慢我怎麼能加快它的速度 –

+0

使用parallel.for爲此它將加快你的代碼 –

+0

觀看答案的更新,不要忘記接受它;-) –