Уверен, что это невозможно. Предположим, вы выполняете следующий код в потоке A:
var task = Task.Factory.StartNew(() => Thread.Sleep(Timeout.Infinite));
task.Wait(5000);
Если задача встроена, поток A будет блокироваться на неопределенный срок - как он проснется после истечения времени ожидания?
Глядя на справочный источник (Task.cs), мы можем видеть именно это:
internal bool InternalWait(int millisecondsTimeout, CancellationToken cancellationToken)
{
...
// we will attempt inline execution only if an infinite wait was requested
// Inline execution doesn't make sense for finite timeouts and if a cancellation token was specified
// because we don't know how long the task delegate will take.
if (millisecondsTimeout == Timeout.Infinite && !cancellationToken.CanBeCanceled &&
WrappedTryRunInline() && IsCompleted)
{
returnValue = true;
}
else
{
returnValue = CompletedEvent.Wait(millisecondsTimeout, cancellationToken);
}
В соответствии с вашим вопросом, чтобы извлечь выгоду из встраивания с конечными тайм-аутами, вам нужно реализовать логику тайм-аута внутри самой задачи, возможно, что-то вроде:
ExecuteWithCancel<TResult>(cts.Token, TimeSpan timeout, nameOfTaskPerformer, arguments)
А затем используйте обычный Wait()
(или Result
).