Как отменить функцию через некоторое время?
Я хочу знать, как я могу отменить функцию через определенное время!
например, как я могу отменить эту функцию?
private async Task function()
{
try
{
while (true)
{
//mycode
}
}
catch{ }
}
4 ответа
как я могу отменить эту функцию?
Обычно ожидаемые методы CancellationToken
так что вы просто передаете это через:
private async Task functionAsync(CancellationToken cancellationToken)
{
while (true)
{
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); //mycode
}
}
Некоторое время назад я столкнулся с той же проблемой и нашел довольно хорошее решение для меня. Таким образом я разделяю асинхронные вызовы на другую службу через wcf (см. Мой код ниже), выполняя две вещи для отмены через максимальное время:
Вы можете использовать CancellationToken в сочетании со второй задачей, чтобы запустить ее параллельно с выполняемой задачей и отменить ее при необходимости:
private const int TimeOut = 50000;
public static async Task<T> HandleServiceCall<T>(Func<Task<T>> doServiceCall, CancellationTokenSource source) where T : class
{
var delaySource = new CancellationTokenSource(TimeSpan.FromSeconds(50));
source.Token.ThrowIfCancellationRequested();
var res = doServiceCall();
if (await Task.WhenAny(res, Task.Delay(TimeSpan.FromMilliseconds(TimeOut), delaySource.Token)) == res)
{
delaySource.Cancel();
await res;
}
else
{
source.Cancel();
throw new Exception("Your Text");
}
return await res;
}
Вы можете вызвать этот метод, например, так:
var source = new CancellationTokenSource(TimeSpan.FromSeconds(50));
source.Token.ThrowIfCancellationRequested();
MyWrapperClass.HandleServiceCall(async () => await MyAsyncMethod(source.Token), source).Result
Чтобы прояснить, что здесь делается: я создаю токен отмены для своей задачи с заданным максимальным интервалом времени, а затем передаю этот токен асинхронному методу, который должен быть вызван. Этот вызов передается как функция в мой метод HandleServiceCall. Этот метод создаст еще один CancellationToken с заданным большим временным интервалом, который будет запускаться как отложенная задача (task.Delay будет просто ждать, пока токен не будет запущен). Task.WhenAny будет проверять, заканчивается ли обычная асинхронная задача или отложенная задача первой. Если это задержка, ваше максимальное время истекло, и выдается исключение.
Привет Константин
Я добавляю небольшой пример
static CancellationTokenSource cts;
static void Main(string[] args)
{
cts = new CancellationTokenSource();
Task.Factory.StartNew(test);
cts.Cancel();
}
private async static void test()
{
await function(cts.Token);
}
static async Task function(CancellationToken ct)
{
try
{
while (!ct.IsCancellationRequested)
{
Thread.Sleep(1000);
//mycode
}
}
catch { }
}
Вы можете использовать класс Timer, запустить его, когда захотите (начало программы предположительно), и использовать некоторые из них, например простой оператор if, чтобы остановить его, например *, если timer больше установленного времени, завершить программу. *