Cube.Timer
1.0.3
See the version list below for details.
dotnet add package Cube.Timer --version 1.0.3
NuGet\Install-Package Cube.Timer -Version 1.0.3
<PackageReference Include="Cube.Timer" Version="1.0.3" />
paket add Cube.Timer --version 1.0.3
#r "nuget: Cube.Timer, 1.0.3"
// Install Cube.Timer as a Cake Addin #addin nuget:?package=Cube.Timer&version=1.0.3 // Install Cube.Timer as a Cake Tool #tool nuget:?package=Cube.Timer&version=1.0.3
hashed-wheel-timer
A .NET implementation of Timer, which optimized for approximated I/O timeout scheduling, also called Approximated Timer. Inspired by Netty HashedWheelTimer.
.NET implemented & Optimized & Notes:
- Replace doubly-linked-list with singly-linked-list to reduce memory used.
- Use ArrayPool to Prevent GC.
- Optimized for small task that will be executed after a short delay. If it takes a long time to complete the task, consider to start a new thread.
tickDuration
: the smaller value you set, the higher level of precision you get. but it will keep the timer busy for ticking. Adjust thetickDuration
&ticksPerWheel
in your case.- Testing passed of ~4,000,000 timer tasks, I think it's good enough for general scenarios.
Install
Download the source code, or NuGet package
https://www.nuget.org/packages/Cube.Timer
Usage
More details in the test-project
// constructor
public HashedWheelTimer(
TimeSpan tickDuration,
int ticksPerWheel = 512,
long maxPendingTimerTasks = 0,
ILogger<HashedWheelTimer> logger = null)
Create an instance of timer, then add new timer-task
.
AddTask
var timer = new HashedWheelTimer(); // use the default value
// add a new task with lambda expression, delay 1357ms.
var handle = timer.AddTask(1357, () =>
{
Debug.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} : do work. ");
});
// check the status of task
if(handle.Cancelled || handle.Expired) { }
// task can be cancelled, call the method.
handle.Cancel();
// reuse the timerTask
timer.AddTask(2000, handle.TimerTask);
// ------------------
// add a new task with lambda expression, passing parameter=999
timer.AddTask(TimeSpan.FromMilliseconds(1234), (prm) =>
{
Debug.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} : do work. parameter={prm}");
}, 999);
// ------------------
// add a new task which instant class implements ITimerTask
timer.AddTask(4357, new MyTimerTask());
// ------------------
// stop the timer, and get the unprocessed tasks.
IEnumerable<TimerTaskHandle> unprocessedTasks = await timer.Stop(gatherUnprocessedTasks:true);
// ------------------
// check the padding tasks
if(timer.IsRunning && timer.PendingTasks != 0) { }
Implement the ITimerTask
public interface ITimerTask
{
/// <summary>
/// If it takes a long time to complete the task, consider to start a new thread.
/// </summary>
/// <returns></returns>
Task RunAsync();
}
public class MyTimerTask : ITimerTask
{
public Task RunAsync()
{
Debug.WriteLine($"do work.");
return Task.CompletedTask;
}
}
AddNotice
For batch operation. A notice
is an object
, can represent anything.
// firstly set the callback delegate.
timer.SetNoticeCallback((notices) =>
{
// batch operation
foreach (var obj in notices)
{
// ...
}
});
// then add the notices.
timer.AddNotice(1357, 1357);
timer.AddNotice(TimeSpan.FromMilliseconds(1234), "{\"id\":32,\"name\":\"Jeo\"}");
// ... add more notices
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.Logging.Abstractions (>= 3.1.32)
- System.Memory (>= 4.5.5)
-
net6.0
- Microsoft.Extensions.Logging.Abstractions (>= 3.1.32)
-
net7.0
- Microsoft.Extensions.Logging.Abstractions (>= 3.1.32)
- System.Memory (>= 4.5.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
1. Optimized & clean the codes.
2. Replace doubly-linked-list with singly-linked-list to reduce memory used.
3. Use ArrayPool to Prevent GC.
4. Testing passed of ~4,000,000 timer tasks, I think it's good enough for general scenarios.