Winify

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 29  →  ?path2? @ 30
/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
}
}