在具有超时的同一线程(无线程池)中同步运行任务

时间:2013-04-18 23:43:25

标签: c# task-parallel-library async-await c#-5.0 continuations

我想使用Task<>输入,但不是TPL,而是使用.NET4.5 / C#async。

事情是,我对我的案子有一些要求:

  • 我希望同步运行任务(有些人推荐RunSynchronously(),其他人推荐Wait(),其他人ContinueWith(_, TaskContinuationOptions.ExecuteSynchronously),其中一个就足够了吗?)。
  • 我希望任务在相同的线程中运行(所以,根本不要使用线程池)。
  • 我希望任务在经过某个超时后停止,然后抛出异常。

对于后者,我认为我需要Task.Delay(),但我不确定如何将它与前两个要求结合起来。 感谢

1 个答案:

答案 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()