2017-05-06 2 views
0

私のプログラムはforループに入ると動作を停止します。それは本当に私はそれを解決することができますどのようにプログラムを遅く??C#Windowsアプリケーションはループ処理のために大きく起動すると動作を停止します

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

      if (//condition) 
      { 



       try 
       { 
     /////// 

       } 


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

     } 
+1

あなたはUIをブロックすることなくバックグラウンドタスクを作るために' BackgroundWorker'を使用することができます形成しています。 –

+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。 –

答えて

1

いいえ、Application.DoEvents()を使用することは、決して実際には最善の方法ではありません。

ループを独自の関数の中に入れ、独自のスレッドで呼び出すことをお勧めします。このようにして、UIスレッドはループが別々に実行されたままになります。あなたが少し研究してあなたの状況に最も適しているかを決定したい場合は、TasksCallBacksまたはasyncメソッドを使用するなど、これを達成する他の方法があります。

このような何か:

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

または:

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

を私はその構文をチェックするために、現時点ではIDEにアクセスすることはできませんが。

+0

tnxたくさん私はそれをします 実際に私はそれもプロセスを開始した後にUIを必要としません私はちょうどプログラムがその仕事をしたい –

+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このリンクWindowsで

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

答えの更新を見て、それを受け入れることを忘れないでください;-) –

関連する問題