Правильный способ запуска независимого фонового процесса - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу, чтобы этот метод запустился, создал фоновый процесс и завершил работу. Я не хочу await для завершения асинхронной операции, я просто хочу, чтобы какой-то процесс работал в фоновом режиме.

  1. Я пытался использовать Task.Run, но когда я пытаюсь отладить код внутри него, точка останова никогда не срабатывает.
  2. Я подумал, что, возможно, Task.Run предназначен только для операций, которые следует ожидать, поэтому я попытался использовать BackgroundWorker и поставить точки останова в обоих местах, Task.Run и BackgroundWorker.DoWork.
  3. Теперь точка останова внутри Task.Run ударяется дважды, но точка останова внутри BackgroundWorker пропускается.
public override void Connect()
{
  // Uncomment code below and breakpoint inside Task.Run starts magically working :) 

  //var bgw = new BackgroundWorker();
  //bgw.DoWork += (_, __) => { Thread.Sleep(1000); };
  //bgw.RunWorkerCompleted += (_, __) => {};
  //bgw.RunWorkerAsync();

  Task.Run(() => {
    while (true) // Breakpoint here will NOT work
    {
      var x = 1; // Do something
    }
  });

  // Thread.Sleep(5000); // Uncommenting this also makes breakpoint working
}

Вопрос

Почему точка останова внутри асинхронного c процесса не используется и как правильно создать процесс, который будет работать даже после завершения метода, который создал этот процесс?

Обновление

Похоже, что основной процесс завершается до создания задачи, потому что, если я добавлю Thread.Sleep(5000) сразу после Task.Run оно достигает точки останова. Скорее всего, это ожидаемое поведение, чтобы убедиться, что основной процесс завершает все дочерние потоки перед выходом.

...