Tuesday, 20 August 2013

How to retry until success or timeout asynchronously?

How to retry until success or timeout asynchronously?

I wrote down these lines of code:
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; }
}
}
But as I understand the Result property invokation will block a caller.
So, I quite don't understand how to accomplish this task: "How to execute
a task asynchronously, so if timeout is exceeded then it will return false
or it will return the result of the task which should be executed over and
over again?"

No comments:

Post a Comment