ScheduledItem<TAbsolute>
public abstract class ScheduledItem<TAbsolute> : IScheduledItem<TAbsolute>, IComparable<ScheduledItem<TAbsolute>> where TAbsolute : IComparable<TAbsolute>
using System.Collections.Generic;
using System.Reactive.Disposables;
namespace System.Reactive.Concurrency
{
public abstract class ScheduledItem<TAbsolute> : IScheduledItem<TAbsolute>, IComparable<ScheduledItem<TAbsolute>> where TAbsolute : IComparable<TAbsolute>
{
private readonly SingleAssignmentDisposable _disposable = new SingleAssignmentDisposable();
private readonly IComparer<TAbsolute> _comparer;
public TAbsolute DueTime { get; }
public bool IsCanceled => _disposable.IsDisposed;
protected ScheduledItem(TAbsolute dueTime, IComparer<TAbsolute> comparer)
{
if (comparer == null)
throw new ArgumentNullException("comparer");
DueTime = dueTime;
_comparer = comparer;
}
public void Invoke()
{
if (!_disposable.IsDisposed)
_disposable.Disposable = InvokeCore();
}
protected abstract IDisposable InvokeCore();
public int CompareTo(ScheduledItem<TAbsolute> other)
{
if ((object)other == null)
return 1;
return _comparer.Compare(DueTime, other.DueTime);
}
public static bool operator <(ScheduledItem<TAbsolute> left, ScheduledItem<TAbsolute> right)
{
return Comparer<ScheduledItem<TAbsolute>>.Default.Compare(left, right) < 0;
}
public static bool operator <=(ScheduledItem<TAbsolute> left, ScheduledItem<TAbsolute> right)
{
return Comparer<ScheduledItem<TAbsolute>>.Default.Compare(left, right) <= 0;
}
public static bool operator >(ScheduledItem<TAbsolute> left, ScheduledItem<TAbsolute> right)
{
return Comparer<ScheduledItem<TAbsolute>>.Default.Compare(left, right) > 0;
}
public static bool operator >=(ScheduledItem<TAbsolute> left, ScheduledItem<TAbsolute> right)
{
return Comparer<ScheduledItem<TAbsolute>>.Default.Compare(left, right) >= 0;
}
public static bool operator ==(ScheduledItem<TAbsolute> left, ScheduledItem<TAbsolute> right)
{
return (object)left == right;
}
public static bool operator !=(ScheduledItem<TAbsolute> left, ScheduledItem<TAbsolute> right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
return this == obj;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public void Cancel()
{
_disposable.Dispose();
}
}
}