次のコード行を書き留めました。
public static bool RetryUntilSuccessOrTimeoutAsync(Func<bool> task,
TimeSpan executionTimeout, CancellationToken? token = null) {
var data = new ExecutionContextData(task, executionTimeout, token);
var nonBlockingTask = new Task<bool>(SyncTaskExecutor, data);
nonBlockingTask.Start();
var result = nonBlockingTask.ContinueWith(t => t.Result);
return result.Result;
}
class ExecutionContextData {
private readonly Func<bool> task;
private readonly TimeSpan executionTimeout;
private readonly CancellationToken? cancellationToken;
public ExecutionContextData(Func<bool> task, TimeSpan executionTimeout, CancellationToken? cancellationToken) {
this.cancellationToken = cancellationToken;
this.executionTimeout = executionTimeout;
this.task = task;
}
public Func<bool> Task {
get { return task; }
}
public TimeSpan ExecutionTimeout {
get { return executionTimeout; }
}
public CancellationToken? CancellationToken {
get { return cancellationToken; }
}
}
private static bool SyncTaskExecutor(object executionHelper) {
var context = executionHelper as ExecutionContextData;
Task<bool> newTask =
context.CancellationToken.HasValue ? new Task<bool>(ExecuteTask, context.Task, context.CancellationToken.Value)
: new Task<bool>(ExecuteTask, context.Task);
newTask.Start();
bool timeoutResult = newTask.Wait(context.ExecutionTimeout);
if (timeoutResult)
return newTask.Result;
return false;
}
しかし、私が理解しているように、Result プロパティの呼び出しは呼び出し元をブロックします。そのため、このタスクを達成する方法がよくわかりません:「タスクを非同期で実行する方法で、タイムアウトを超えると false が返されるか、何度も実行されるべきタスクの結果が返されますか? "