长时间运行第3库方法的超时

时间:2018-04-04 10:44:41

标签: c#

我想添加取消长时间运行外部方法的功能(在下面的代码中是来自LongOperation类的SomeExternalClass方法),所以我将此方法包装到任务中并为句柄超时添加自定义任务扩展。

TimeoutException在特定时间段后成功抛出,但外部方法取消。我如何取消LongOperation

class Program
{
    private static CancellationTokenSource cancellationTokenSource;

    static async Task Main(string[] args)
    {
        cancellationTokenSource = new CancellationTokenSource();
        cancellationTokenSource.Token.ThrowIfCancellationRequested();

        try
        {
            await SearchTask().WithTimeout(TimeSpan.FromSeconds(2));
        }
        catch (TimeoutException)
        {
            Console.WriteLine("Timeout");
            cancellationTokenSource.Cancel();
        }

        Console.WriteLine("Program end");
        Console.ReadKey();
    }

    private static Task SearchTask()
    {
        return Task.Run(() =>
        {
            Console.WriteLine("Start task");

            SomeExternalClass.LongOperation();

            Console.WriteLine("End task");
        }, cancellationTokenSource.Token);
    }
}

public static class SomeExternalClass
{
    // this is simulation of long running 3rd party method 
    public static void LongOperation()
    {
        Console.WriteLine("Start LongOperation");
        Thread.Sleep(10000);
        Console.WriteLine("End LongOperation");
    }
}

public static class TaskExtension
{
    public static async Task WithTimeout(this Task task, TimeSpan timeout)
    {
        if (task == await Task.WhenAny(task, Task.Delay(timeout)))
        {
            await task;
        }
        throw new TimeoutException();
    }
}

输出结果为:

Start task
Start LongOperation
Timeout
Program end
End LongOperation
End task

0 个答案:

没有答案