##// END OF EJS Templates
Добавлена метка v3.0.8 для набора изменений f1696cdc3d7a
Добавлена метка v3.0.8 для набора изменений f1696cdc3d7a

File last commit:

r262:f1696cdc3d7a v3.0.8 v3
r263:711572866e0c v3
Show More
PollingComponent.cs
93 lines | 2.8 KiB | text/x-csharp | CSharpLexer
cin
missing file
r258 using System;
using System.Threading;
using System.Threading.Tasks;
namespace Implab.Components {
public abstract class PollingComponent : RunnableComponent {
readonly Timer m_timer;
readonly CancellationTokenSource m_cancellation = new CancellationTokenSource();
cin
PollingComponent: implemented correct stopping
r259 Task m_pending;
Task m_poll;
cin
missing file
r258 /// <summary>
/// Poll interval in milliseconds.
/// </summary>
/// <returns></returns>
public int Interval { get; set; }
/// <summary>
/// Delay to the first poll after start in milliseconds
/// </summary>
/// <returns></returns>
public int Delay { get; set; }
/// <summary>
/// Indicates how to handle unhandled exceptions in <see cref="Poll()"/> method.
/// </summary>
/// <returns></returns>
public bool FailOnError { get; set; }
/// <summary>
/// Event for the unhandled exceptions in <see cref="Poll()"/> method.
/// </summary>
public event EventHandler<UnhandledExceptionEventArgs> UnhandledException;
protected PollingComponent(bool initialized) : base(initialized) {
m_timer = new Timer(OnTimer);
}
protected override void RunInternal() {
ScheduleNextPoll(Delay);
}
cin
PollingComponent: implemented correct stopping
r259 protected override async Task StopInternalAsync(CancellationToken ct) {
// component in Stopping state, no new polls will be scheduled
m_cancellation.Cancel();
try {
// await for pending poll
cin
Added IInitializable.Initialize() overload...
r262 if (m_poll != null)
await m_poll;
cin
minor fixes
r260 } catch (OperationCanceledException) {
cin
PollingComponent: implemented correct stopping
r259 // OK
}
}
cin
missing file
r258
protected abstract Task Poll(CancellationToken ct);
void ScheduleNextPoll(int timeout) {
lock (SynchronizationObject) {
cin
PollingComponent: implemented correct stopping
r259 if (State == ExecutionState.Running) {
m_pending = Safe.CreateTask(m_cancellation.Token);
m_poll = m_pending.Then(() => Poll(m_cancellation.Token));
cin
missing file
r258 m_timer.Change(timeout, Timeout.Infinite);
cin
PollingComponent: implemented correct stopping
r259 }
cin
missing file
r258 }
}
cin
PollingComponent: implemented correct stopping
r259 async void OnTimer(object state) {
cin
missing file
r258 try {
cin
PollingComponent: implemented correct stopping
r259 m_pending.Start();
await m_poll;
cin
minor fixes
r260 ScheduleNextPoll(Interval);
cin
missing file
r258 } catch (Exception e) {
UnhandledException.DispatchEvent(this, new UnhandledExceptionEventArgs(e, false));
cin
minor fixes
r260
cin
missing file
r258 if (FailOnError)
Fail(e);
cin
minor fixes
r260 else
ScheduleNextPoll(Interval);
cin
missing file
r258 }
cin
minor fixes
r260
cin
missing file
r258 }
protected override void Dispose(bool disposing) {
if (disposing)
Safe.Dispose(m_timer, m_cancellation);
base.Dispose(disposing);
}
}
}