2017-05-06 42 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

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