Должен ли модуль Perl вызывать исключения (die / croak)?

При написании Perl-модуля Но когда я останавливаю мое приложение winform, поток продолжает работать. Я попытался создать деструктор в моем синглтоне ...

У меня есть синглтон, в котором запущен поток для получения записей с сервера. Но когда я останавливаю мое приложение winform, поток продолжает работать. Я попытался создать деструктор в моем синглтоне, чтобы прервать поток, если он запущен, но он не оказывает никакого влияния на поток - я знаю, что деструктор вызывается.

Я ищу предложения о том, как мне закрыть поток, когда мое приложение закрывается. спасибо

C #, .net2

12
задан fishhead 22 August 2010 в 15:39
поделиться

2 ответа

Лучшим вариантом, если это возможно в вашем приложении, является совместная отмена.

Поток автоматически останавливается, когда у него больше нет кода для выполнения. Итак, когда пользователь закрывает ваше приложение, вы устанавливаете флаг, указывающий, что ваш поток должен остановиться. Поток должен время от времени проверять, установлен ли флаг, и, если да, прекратить получение записей с сервера и вернуться.

В противном случае вы можете использовать собственное решение, например

static bool isCancellationRequested = false;
static object gate = new object();

// request cancellation
lock (gate)
{
    isCancellationRequested = true;
}

// thread
for (int i = 0; i < 100000; i++)
{
    // simulating work
    Thread.SpinWait(5000000);

    lock (gate)
    {
        if (isCancellationRequested)
        {
            // perform cleanup if necessary
            //...
            // terminate the operation
            break;
        }
    }
}
9
ответ дан 2 December 2019 в 02:53
поделиться

Поток может быть:

  • Передний план : будет поддерживать жизнь ваших программ, пока они не закончатся.
  • Фоновый: будет завершен, когда вы закроете свое приложение.

Когда вы создаете поток, он по умолчанию является потоком переднего плана.

Вы можете изменить это следующим образом:

Thread t = new Thread(myAction);
t.IsBackground = true;
t.Start();
61
ответ дан 2 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

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