У меня есть функция, которая возвращает строку в соответствии с некоторыми условиями. Если функция не завершилась за 5 секунд, я хочу ее остановить и вернуть другое значение. Моя функция выполняет несколько попыток поиска из базы данных. Возможно, это займет больше пяти секунд, а затем я хочу остановить попытки поиска и вместо этого вернуть другое значение для тех, кто вызывает функцию , как я могу это сделать? благодаряC# threads stop execute
ответ
Вы можете использовать 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
}
}
Но это фактически не останавливает функцию, она позволяет продолжать и игнорировать результат. – svick
@svick well .. CancellationToken можно использовать. Зависит от того, что делает его функция. –
Я думаю, что если требуется аннулирование, метод должен выдать исключение, поэтому «Задача» переключается в отмененное состояние. – svick
- 1. Threads stop working C++
- 2. stop Task.Factory and Threads
- 3. JavaFX stop threads
- 4. C++ winapi threads
- 5. C++ threads и classess
- 6. Aborting C# threads
- 7. C# winforms and threads
- 8. C# Threads - Interrupt
- 9. C++ Threads - pthread_create, pthread_join
- 10. C# Threads, WaitHandle.WaitAll
- 11. Throttling C++ threads
- 12. Background Threads in C#
- 13. C# Threads Multiple Queue
- 14. Linux, C: threads synch
- 15. C++ Confused о Threads
- 16. Reuse Threads - C++
- 17. C# Mysql threads
- 18. C# Threads -ThreadStart Delegate
- 19. C++ Threads - Crashes
- 20. C - GTK3 и Threads
- 21. c cleanup unused threads
- 22. Отладка C# Threads
- 23. C# execute variable code
- 24. C# Рослин Execute
- 25. C# execute Powershell
- 26. c execute не работает
- 27. Проблема с posix threads C++
- 28. C++ threads for background loading
- 29. C# wait for other threads
- 30. Lua, threads и исключения C++
Сценарий «Я хочу, чтобы остановить его» потребует ** много уточняющего вопроса. –
Возможный дубликат [Does Task.Wait (int) останавливает задачу, если истечет тайм-аут без завершения задачи?] (Http://stackoverflow.com/questions/4036198/does-task-waitint-stop-the-task- if-the-timeout-elapses-without-the-task-finish) – Prix
Как, вы имеете в виду изнутри функции или извне? И что это за функция? –