Задать вопрос
s2d1ent
@s2d1ent
Специалист технической поддержки

Как решить быстрое закрытие программы?

Всем привет товарищи программисты. Столкнулся с такой проблемой, что при запуске программы она быстро закрывается, сейчас поясню
using System;
using System.Collections.Generic;

namespace System.Finder
{
    class Program
    {
        // список томов на ПК
        public List<Directory> Directories = new List<Directory>();
        static void Main(string[] args)
        {
            // инициализация сканирования
            Directory d = new Directory(true);
            Console.ReadKey();
        }
    }
}


Это основной файл проекта в котором происходит инициализация и в принципе все, больше в нем ничего не делается, все остальные действия программы описаны в другом файле и с ReadKey(в Main) делаются автоматически. Но если убрать ReadKey(из Main), то программа моментально свернется, если убрать ReadKey и запустить программу в фоне произойдет тоже самое.

public Directory() { }
        public Directory(bool th)
        {
            Scan();
        }
        public Directory(string name, string adress)
        {
            this.name = name;
            this.adress = adress;
            new Task(()=> { Start(); }).Start();
        }
        // сканирование томов ПК
        public void Scan()
        {
            DriveInfo[] drivers = DriveInfo.GetDrives();
            foreach (var driver in drivers)
            {
                new Task(()=> { new Program().Directories.Add(new Directory(driver.Name, driver.ToString())); }).Start();
            }
        }

Это кусок кода из второго файла, он начинает делать все остальные действия, пожалуйста не бейте если я как-то криво пишу, опыт маленький, лучше просто поясните что я делаю не так. Во втором файле описаны функции для начала работы по и рекурсивные функции которые выполняются до определенного момента.
Ссылка на Git , возможно так будет понятнее(ветка test).
  • Вопрос задан
  • 199 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Вот так можно написать класс сканер, который получает данные асинхронно. Использовать его можно таким образом в любом типе приложений. Например, в WPF приложение не будет зависать, если, скажем, запустить сканирование по клику на кнопке.

Обрати ещё внимание на метод с Task.Factory.StartNew и параметром TaskCreationOptions.LongRunning. Для сканирования папок, думаю использовать стоит.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            try
            {
                // Создаём экземпляр класса
                var scanner = new Scanner();
                // Вызываем асинхронный метод Scan, метод работает
                // какое-то время, возвращает результат.
                var data = await scanner.Scan();
                foreach (var item in data)
                {
                    // Выводим на консоль.
                    Console.WriteLine(item);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }

    public class Scanner
    {
        public Task<List<string>> Scan()
        {
            return Task.Run(async () =>
            {
                var results = new List<string>();

                for (int i = 0; i < 10; i++)
                {
                    // Делаем правильную задержку (имитация долгой работы для примера).
                    await Task.Delay(250);
                    // Собираем данные
                    results.Add(DateTimeOffset.Now.ToLocalTime().ToString());
                }

                return results;
            });
        }

        public async Task<List<string>> ScanVersion2()
        {
            return await Task.Factory.StartNew(async () =>
            {
                var results = new List<string>();

                for (int i = 0; i < 10; i++)
                {
                    // Делаем правильную задержку (имитация долгой работы для примера).
                    await Task.Delay(250);
                    // Собираем данные
                    results.Add(DateTimeOffset.Now.ToLocalTime().ToString());
                }

                return results;
            }, TaskCreationOptions.LongRunning)
                .Unwrap() // Без этого возвращается Task<List<string>>, а не List<string>
                .ConfigureAwait(false);
        }
    }
}


Стоит почитать книгу "Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование"
Скриншот сделан с видео: https://youtu.be/lh8cT6qI-nA?t=1123

612185e7a4563153795281.jpeg
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Какой вопрос - такой и ответ
Изучи как работает Main() и тебе всё станет ясно
Книжки читал?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы