【问题标题】:How can I add timeout to this code [duplicate]如何向此代码添加超时[重复]
【发布时间】:2014-12-23 08:06:43
【问题描述】:

我正在尝试为此代码添加超时,但由于我是新手,所以我无法弄清楚,

Task.Factory.StartNew(() =>
{
     Aspose.Words.Document doc = new Aspose.Words.Document(inputFileName);
     doc.Save(Path.ChangeExtension(inputFileName, ".pdf"));
});

我还希望主线程在这里等待,直到它超时 5 分钟或完成。

编辑

或者我可以使用取消令牌,如果是,那么如何:(?

【问题讨论】:

标签: c# .net c#-4.0 task-parallel-library async-await


【解决方案1】:

您可以使用Task.Delay 创建一个新的Task 并使用Task.WhenAny

Task delayedTask = Task.Delay(TimeSpan.FromMinutes(5));
Task workerTask = Task.Factory.StartNew(() =>
{
     Aspose.Words.Document doc = new Aspose.Words.Document(inputFileName);
     doc.Save(Path.ChangeExtension(inputFileName, ".pdf"));
});

if (await Task.WhenAny(delayedTask, workerTask) == delayedTask)
{
   // We got here because the delay task finished before the workertask.
}
else
{
   // We got here because the worker task finished before the delay.
}

您可以使用Microsoft.Bcl.Asyncasync-await 功能添加到.NET 4.0

编辑:

当您使用 VS2010 时,您可以改用 Task.Factory.ContinueWheAny

Task.Factory.ContinueWhenAny(new[] { delayedTask, workerTask }, task =>
{
    if (task == delayedTask)
    {
        // We got here if the delay task finished before the workertask.
    }
    else
    {
        // We got here if the worker task finished before the delay.
    }
});

编辑 2:

由于Task.Delay 在 .NET 4.0 中不可用,您可以使用扩展方法自行创建:

public static class TaskExtensions
{
    public static Task Delay(this Task task, TimeSpan timeSpan)
    {
        var tcs = new TaskCompletionSource<bool>();
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Elapsed += (obj, args) =>
        {
            tcs.TrySetResult(true);
        };
        timer.Interval = timeSpan.Milliseconds;
        timer.AutoReset = false;
        timer.Start();
        return tcs.Task;
    } 
}

【讨论】:

  • 感谢您的快速回答,但我收到这些错误时是否需要添加任何程序集,prntscr.com/5k07ly
  • 是的,您需要通过NuGet 添加程序集。我在帖子中添加了一个链接
  • 我喜欢这个答案。 @YuvalItzchakov WhenAny 在第一个任务完成后取消另一个任务执行吗?之后找出哪个任务已完成的正确方法是什么?
  • 不,它不会取消它。但是如果你传递一个CancellationToken 给它,你可以自己取消它。至于你的第二个问题,我已经编辑了我的代码。
  • 好的!我假设在第一个任务完成后我们要做的第一件事是取消第二个正在运行的任务:)
猜你喜欢
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多