2013-06-19 5 views
0

У меня есть функция, которая возвращает строку в соответствии с некоторыми условиями. Если функция не завершилась за 5 секунд, я хочу ее остановить и вернуть другое значение. Моя функция выполняет несколько попыток поиска из базы данных. Возможно, это займет больше пяти секунд, а затем я хочу остановить попытки поиска и вместо этого вернуть другое значение для тех, кто вызывает функцию , как я могу это сделать? благодаряC# threads stop execute

+6

Сценарий «Я хочу, чтобы остановить его» потребует ** много уточняющего вопроса. –

+0

Возможный дубликат [Does Task.Wait (int) останавливает задачу, если истечет тайм-аут без завершения задачи?] (Http://stackoverflow.com/questions/4036198/does-task-waitint-stop-the-task- if-the-timeout-elapses-without-the-task-finish) – Prix

+0

Как, вы имеете в виду изнутри функции или извне? И что это за функция? –

ответ

1

Вы можете использовать Task.Wait ждать завершения задачи, и CancellationToken отменить выполнение задания, если оно не было завершено в указанный тайм-аут:

var tokenSource = new CancellationTokenSource(); 
var token = tokenSource.Token; 
// assume your function returns integer value 
Task<int> task = Task<int>.Factory.StartNew(() => GetData(token), token); 

int result; 
if (task.Wait(5000)) 
    result = task.Result; 
else 
{ 
    tokenSource.Cancel(); // cancel task 
    result = 42; // default value 
} 

А вот ваш метод для извлечения данных

private int GetData(CancellationToken token) 
{ 
    int attemptsCount = 5; 

    for (int i = 0; i < attemptsCount; i++) 
    { 
     if (token.IsCancellationRequested) 
      token.ThrowIfCancellationRequested(); // OperationCanceledException 

     // try get data from database 
     // return data 
    } 
} 
+1

Но это фактически не останавливает функцию, она позволяет продолжать и игнорировать результат. – svick

+0

@svick well .. CancellationToken можно использовать. Зависит от того, что делает его функция. –

+0

Я думаю, что если требуется аннулирование, метод должен выдать исключение, поэтому «Задача» переключается в отмененное состояние. – svick