/trunk/Winify/Utilities/ScheduledContinuation.cs |
@@ -0,0 +1,105 @@ |
using System; |
using System.Threading; |
using System.Threading.Tasks; |
|
namespace Winify.Utilities |
{ |
public class ScheduledContinuation : IDisposable |
{ |
#region Constructors, Destructors and Finalizers |
|
public void Dispose() |
{ |
if (_cancellationTokenSource != null) |
{ |
_cancellationTokenSource?.Cancel(); |
_cancellationTokenSource?.Dispose(); |
_cancellationTokenSource = null; |
} |
} |
|
#endregion |
|
#region Private Delegates, Events, Enums, Properties, Indexers and Fields |
|
private CancellationTokenSource _cancellationTokenSource; |
|
private Task _task; |
|
#endregion |
|
#region Public Methods |
|
public void Schedule(TimeSpan delay, Action execute, CancellationToken cancellationToken) |
{ |
try |
{ |
if (_task != null) |
{ |
_cancellationTokenSource?.Cancel(); |
_cancellationTokenSource?.Dispose(); |
_cancellationTokenSource = null; |
_task = null; |
} |
} |
catch |
{ |
// Ignore errors. |
} |
finally |
{ |
_cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); |
} |
|
_task = Task.Delay(delay, _cancellationTokenSource.Token) |
.ContinueWith(task => |
{ |
try |
{ |
execute.Invoke(); |
} |
catch (Exception exception) when (exception is ObjectDisposedException || |
exception is OperationCanceledException) |
{ |
} |
}, _cancellationTokenSource.Token); |
} |
|
public void Schedule(int delay, Action execute, CancellationToken cancellationToken) |
{ |
try |
{ |
if (_task != null) |
{ |
_cancellationTokenSource?.Cancel(); |
_cancellationTokenSource?.Dispose(); |
_cancellationTokenSource = null; |
_task = null; |
} |
} |
catch |
{ |
// Ignore errors. |
} |
finally |
{ |
_cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); |
} |
|
_task = Task.Delay(delay, _cancellationTokenSource.Token) |
.ContinueWith(task => |
{ |
try |
{ |
execute.Invoke(); |
} |
catch (Exception exception) when (exception is ObjectDisposedException || |
exception is OperationCanceledException) |
{ |
} |
}, _cancellationTokenSource.Token); |
} |
|
#endregion |
} |
} |