繁体   English   中英

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

[英]Synchronously run a task in the same thread (no threadpool) with a timeout

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

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

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

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

这个答案是基于@ svick的评论。

我将假设您希望方法的所有“工作”都在与调用者相同的线程上完成,但是您不介意线程池线程是否用于取消目的(I'假设这是因为你提到了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.
}

显然,使用这种使用协作取消的方法,该方法不会在超时时准确超时,因为它取决于您在方法中拆分工作的程度。

如果你想避免使用另一个线程(对于CancellationTokenSource ),那么你可以跟踪开始时间,然后在方法的不同点检查已经过了多少时间(看你是否超过了超时)(比如如何在上面使用ct.ThrowIfCancellationRequested()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM