Вот пример, который не работает, но должен проиллюстрировать концепцию:
Код: Выделить всё
public static void Main()
{
try
{
Task.Delay(5000).ContinueWith((t) => throw new Exception());
DoSomething();
}
catch (Exception ex)
{
Console.WriteLine("Method 'DoSomething' took longer than 5 seconds and has been aborted.");
}
}
Мне интересно узнать, есть ли какие-либо способы успешно выполнить это без необходимости создания родительский метод асинхронный. Возможно, какой-то способ передать ссылку на основной поток, обратный вызов или обработчик событий?
ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ
Кажется, мой вопрос был не очень ясен. Я не утверждаю, что этот пример кода является «хорошим» решением или что это вообще решение. Я просто пытался проиллюстрировать концепцию и предложить действенные методы достижения этой функциональности. Забыв об особенностях примера кода, предположим следующие ограничения:
- Вы работаете в рамках синхронного метода.
- Вам нужно вызвать какой-то другой внешний синхронный метод. Вы не знаете, сколько времени потребуется для завершения.
- Если внешний метод завершится в течение n секунд, отлично. В противном случае вы хотите отказаться от вызова внешнего метода и позволить остальной части вашего кода продолжить работу.
Подробнее здесь: https://stackoverflow.com/questions/785 ... ain-thread
Мобильная версия