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
,您可以自己取消它。至于您的第二个问题,我已经编辑了我的代码。好吧!我想在第一项任务完成后,我们要做的第一件事就是取消第二项正在运行的任务:)