该答案基于@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()
上面用到了。