0

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

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

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

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

4

1 回答 1

2

该答案基于@svick 的评论。

我将假设您希望该方法的所有“工作”与调用者在同一个线程上完成,但是您不介意线程池线程是否用于取消目的(I'我假设这是因为您提到Task.Delay哪个将Timer在计时器触发时使用哪个将使用线程池线程。

也就是说,不需要Task,因为当方法返回时,您会确定 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()上面用到了。

于 2013-04-19T03:35:40.550 回答