Приложение 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();
    }
}
}`
Другие вопросы по тегам