Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将超时添加到此代码_C#_.net_C# 4.0_Task Parallel Library_Async Await - Fatal编程技术网

C# 如何将超时添加到此代码

C# 如何将超时添加到此代码,c#,.net,c#-4.0,task-parallel-library,async-await,C#,.net,C# 4.0,Task Parallel Library,Async Await,我想给这段代码加上超时时间,但因为我是新手,我想不出来 Task.Factory.StartNew(() => { Aspose.Words.Document doc = new Aspose.Words.Document(inputFileName); doc.Save(Path.ChangeExtension(inputFileName, ".pdf")); }); 我还希望主线程在这里等待,直到超时5分钟或完成 编辑 或者我可以将取消令牌与此一起使用吗,如果是,

我想给这段代码加上超时时间,但因为我是新手,我想不出来

Task.Factory.StartNew(() =>
{
     Aspose.Words.Document doc = new Aspose.Words.Document(inputFileName);
     doc.Save(Path.ChangeExtension(inputFileName, ".pdf"));
});
我还希望主线程在这里等待,直到超时5分钟或完成

编辑


或者我可以将取消令牌与此一起使用吗,如果是,则如何:(?

您可以使用
任务创建一个新的
任务。延迟
并使用
任务。当有
时:

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.
}
您可以使用向.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:

由于.NET 4.0中不提供
Task.Delay
,因此您可以使用扩展方法自己创建它:

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;
    } 
}
公共静态类任务扩展
{
公共静态任务延迟(此任务任务,TimeSpan TimeSpan)
{
var tcs=new TaskCompletionSource();
System.Timers.Timer Timer=新的System.Timers.Timer();
计时器运行时间+=(对象,参数)=>
{
tcs.TrySetResult(真);
};
timer.Interval=timeSpan.millides;
timer.AutoReset=false;
timer.Start();
返回tcs.Task;
} 
}

检查此链接:相关问题:谢谢您的快速回答,但是当我收到这些错误时,我需要添加任何程序集吗?是的,您需要通过
NuGet
添加程序集。我在帖子中添加了一个链接,与此类似。@YuvalItzchakov在第一个任务完成后何时取消其他任务执行?正确的方法是什么之后如何确定完成了哪项任务?不,它不会取消它。但是如果您向它传递
CancellationToken
,您可以自己取消它。至于您的第二个问题,我已经编辑了我的代码。好吧!我想在第一项任务完成后,我们要做的第一件事就是取消第二项正在运行的任务:)