Как тайм-аут выполнения функции - PullRequest
2 голосов
/ 24 мая 2019

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

Пример:

lock(objLock){
   DoWork();
}

Итак, я хотел бы ограничить время выполнения функции DoWork (), чтобы другие потоки не ожидали вечного входа в блокировку. Это не помогает мне ограничивать время ожидания других потоков.

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Используйте другой поток для выполнения работы и текущий поток, чтобы быть монитором:

lock(objLock){
    Thread workerThread = new Thread(DoWork);
    workerThread.Start();

    TimeSpan timeout = TimeSpan.FromSeconds(30);
    bool finished = workerThread.Join(timeout);
    if (!finished) workerThread.Abort();
}
0 голосов
/ 24 мая 2019

Вы можете сделать это вручную, добавив, как показано ниже:

DateTime dt = DateTime.Now;
while(Datetime.Now - dt > Atimespan)
{Do some work}

Или вы можете проверить время в цикле

DateTime dt = DateTime.Now;
lock(objLock){
   DoWork();
   if(DateTime.Now - dt > SomeTimeSpan) break;
}
...