我想使用Task<>输入,但不是TPL,而是使用.NET4.5 / C#async。
事情是,我对我的案子有一些要求:
RunSynchronously()
,其他人推荐Wait()
,其他人ContinueWith(_, TaskContinuationOptions.ExecuteSynchronously)
,其中一个就足够了吗?)。对于后者,我认为我需要Task.Delay()
,但我不确定如何将它与前两个要求结合起来。
感谢
答案 0 :(得分:2)
这个答案是基于@ svick的评论。
我将假设您希望方法的所有“工作”都在与调用者相同的线程上完成,但是您不介意线程池线程是否用于取消目的(我假设这是因为您提到了Task.Delay
,它将使用Timer
,它将在计时器触发时使用线程池线程。
也就是说,不需要Task
,因为当方法返回时,您肯定知道任务已完成。只是一个超时的常规方法会:
static void DoSomethingOrThrowAfterTimeout(int millisecondsTimeout)
{
CancellationTokenSource cts = new CancellationTokenSource(millisecondsTimeout);
CancellationToken ct = cts.Token;
// do some work
ct.ThrowIfCancellationRequested();
// do more work
ct.ThrowIfCancellationRequested();
// repeat until done.
}
显然,通过这种使用协作取消的方法,该方法不会在超时时完全超时,因为它取决于您在方法中拆分工作的程度。< / p>
如果你想避免使用另一个线程(对于CancellationTokenSource
),那么你可以跟踪开始时间,然后检查已经过了多少时间(看你是否超过了超时)方法中的各个要点(例如上面如何使用ct.ThrowIfCancellationRequested()
。