Приложение C# windows перестает работать, когда начинается большой процесс цикла
Моя программа перестает работать, когда она входит в цикл for, я решил это с помощью Application.DoEvents(); но это действительно замедлить программу, как я могу решить это??
for (int b = 10011000; b < 99999999; b++)
{
//code
if (//condition )
{
try
{
///////
}
catch
{
//////
}
}
else
{
//////
}
Application.DoEvents();
}
3 ответа
Это довольно интенсивный цикл, который у вас там происходит. Почему бы вам не использовать асинхронную модель вместо этого?
MSDN также проявляет осторожность при использовании этого DoEvents.
И ваш случай кажется хорошим кандидатом на передачу асинхронно.
Хорошо, используя Application.DoEvents()
никогда не лучший способ сделать что-то.
Я бы предложил поместить ваш цикл в его собственную функцию, а затем вызвать его в своем собственном потоке. Таким образом, поток пользовательского интерфейса будет продолжать работать отдельно, пока ваш цикл сделает это. Есть и другие способы достижения этой цели, такие как использование Tasks
а также CallBacks
или же async
методы, если вы хотите сделать небольшое исследование и решить, что является наиболее подходящим для вашей ситуации.
Что-то вроде этого:
Thread backgroundThread = new Thread(()=>myLoopMethod));
backgroundThread.Start();
Или же:
Task myLoop = new Task(() => myLoopMethod));
myLoop.Start();
Хотя у меня нет доступа к IDE в данный момент, чтобы проверить этот синтаксис.
Вам нужно запустить его на другой поток или задачу
как это:
Task task = new Task( () => { /* your code */ } );
task.Start();
с помощью этого кода ваше приложение никогда не останавливается, но не забывайте об изменении параметров пользовательского интерфейса, которые нужно вызывать
this.Invoke(new Action(() => { /*your code*/ }));
для получения дополнительной информации смотрите эти ссылки:
https://www.dotnetperls.com/async
https://www.codeproject.com/Articles/189374/The-Basics-of-Task-Parallelism-via-C
Обновить
и для ускорения вашего кода хорошо использовать параллельный.фор. какую ссылку
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();
}
}
}`