Built on top of the Schtick scheduled task runner. Uses Redis to provide a distributed lock so that for each iteration of a task, the callback will only be called on one server.
To lock a task so that it only runs on one server, use the Wrap()
on the intended callback for the task:
var schtick = new Schtick();
var redis = ConnectionMultiplexer.Connect("localhost:6379");
var wrapper = new RedisSchtickWrapper(() => redis.GetDatabase());
schtick.AddAsyncTask("unique-task-name", "min(*)", wrapper.Wrap((task, timeIntendedToRun) =>
{
// your callback code here
}));
Since the lambda generated by RedisSchtickWrapper.Wrap()
is async, we always add it using Schtick.AddAsyncTask()
. If the inner callback is async, you should use RedisSchtickWrapper.WrapAsync()
.
wrapper.WrapAsync(async (task, time) => await DoSomethingAsync());
The Schtick.AddAsyncTask()
method has an optional lastKnownRun
parameter which is used in conjunction with the window
parameter. If you want to specify a window, you can get the last run time from redis first using the GetLastRunInfo()
or GetLastRunInfoAsync()
methods.
var schtick = new Schtick();
var redis = ConnectionMultiplexer.Connect("localhost:6379");
var wrapper = new RedisSchtickWrapper(() => redis.GetDatabase());
var info = wrapper.GetLastRunInfo("unique-task-name");
schtick.AddAsyncTask("unique-task-name", "hours(*)", wrapper.Wrap((task, timeIntendedToRun) =>
{
// your callback code here
}), lastKnownRun: info.ScheduledTime, window: TimeSpan.FromMinutes(10));