如何在c#中停止异步方法执行?

时间:2017-02-04 04:14:30

标签: c# timer async-await c#-5.0 eventhandler

我正在使用异步方法。当Timer引发超时事件时,如何停止执行?

我的代码:

public async Task<object> Method()
{
    cts = new CancellationTokenSource();
    try
    {
        timer = new System.Timers.Timer(3000);
        timer.Start();
        timer.Elapsed += (sender, e) =>
        {
            try
            {
                timer_Elapsed(sender, e, cts.Token, thread);
            }
            catch (OperationCanceledException)
            {
                return;
            }
            catch (Exception ex)
            {
                return;
            }
        };
        await methodAsync(cts.Token);
        return "message";
    }
    catch (OperationCanceledException)
    {
        return "cancelled";
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

// Async Call
public async Task<object> methodAsync(CancellationToken ct)
{
    try
    {
        pdfDocument = htmlConverter.Convert("path", "");
    }
    catch(Exception ex)
    {
        return x.Message;
    }
}

// Timer event
void timer_Elapsed(object sender, ElapsedEventArgs e, CancellationToken ct)
{ 
    cts.Cancel();
    ct.ThrowIfCancellationRequested();
}

2 个答案:

答案 0 :(得分:1)

以下是取消任务的方法:

public async Task<object> Method()
{
    cts = new CancellationTokenSource();
    await methodAsync(cts.Token);
    return "message";
}

public Task<object> methodAsync(CancellationToken ct)
{
    for (var i = 0; i < 1000000; i++)
    {
        if (ct.IsCancellationRequested)
        {
            break;
        }
        //Do a small part of the overall task based on `i`
    }
    return result;
}

您必须回复ct.IsCancellationRequested属性的更改才能知道何时取消该任务。一个线程/任务没有安全的方法来取消另一个线程/任务。

在您的情况下,您似乎正在尝试调用一个不了解CancellationToken的方法,因此您无法安全地取消此任务。你必须让线程/任务继续完成。

答案 1 :(得分:0)

我认为您可以尝试提及何时取消它。像

这样的东西
cts.CancelAfter(TimeSpan.FromMilliseconds(5000));

此外,您需要在被调用的方法中使用取消令牌。那时候你会知道什么时候取消。