TaskController.cs
143 lines
| 3.7 KiB
| text/x-csharp
|
CSharpLexer
/ Implab / TaskController.cs
cin
|
r7 | using System; | ||
using System.Collections.Generic; | ||||
using System.Linq; | ||||
using System.Text; | ||||
using System.Threading; | ||||
namespace Implab | ||||
{ | ||||
/// <summary> | ||||
/// This class allows to interact with asyncronuos task. | ||||
/// </summary> | ||||
/// <remarks> | ||||
/// Members of this object are thread safe. | ||||
/// </remarks> | ||||
cin
|
r25 | public class TaskController: IProgressNotifier, ITaskController | ||
cin
|
r7 | { | ||
cin
|
r10 | readonly object m_lock; | ||
cin
|
r7 | string m_message; | ||
float m_current; | ||||
float m_max; | ||||
cin
|
r12 | bool m_cancelled; | ||
cin
|
r25 | public event EventHandler Cancelled; | ||
cin
|
r7 | public event EventHandler<ValueEventArgs<string>> MessageUpdated; | ||
public event EventHandler<ValueEventArgs<float>> ProgressUpdated; | ||||
public event EventHandler<ProgressInitEventArgs> ProgressInit; | ||||
public TaskController() | ||||
{ | ||||
m_lock = new Object(); | ||||
} | ||||
public string Message | ||||
{ | ||||
get | ||||
{ | ||||
lock (m_lock) | ||||
return m_message; | ||||
} | ||||
set | ||||
{ | ||||
lock (m_lock) | ||||
{ | ||||
m_message = value; | ||||
OnMessageUpdated(); | ||||
} | ||||
} | ||||
} | ||||
public float CurrentProgress | ||||
{ | ||||
get | ||||
{ | ||||
lock (m_lock) | ||||
return m_current; | ||||
} | ||||
set | ||||
{ | ||||
lock (m_lock) | ||||
{ | ||||
var prev = m_current; | ||||
m_current = value; | ||||
if (m_current >= m_max) | ||||
m_current = m_max; | ||||
if (m_current != prev) | ||||
OnProgressUpdated(); | ||||
} | ||||
} | ||||
} | ||||
public void InitProgress(float current, float max, string message) | ||||
{ | ||||
if (max < 0) | ||||
throw new ArgumentOutOfRangeException("max"); | ||||
if (current < 0 || current > max) | ||||
throw new ArgumentOutOfRangeException("current"); | ||||
lock(m_lock) { | ||||
m_current = current; | ||||
m_max = max; | ||||
m_message = message; | ||||
OnProgressInit(); | ||||
} | ||||
} | ||||
cin
|
r25 | public bool IsCancelled { | ||
cin
|
r12 | get { | ||
lock (m_lock) | ||||
return m_cancelled; | ||||
} | ||||
} | ||||
cin
|
r76 | public void Cancel() { | ||
cin
|
r12 | lock (m_lock) { | ||
cin
|
r76 | if (!m_cancelled) | ||
cin
|
r12 | m_cancelled = true; | ||
} | ||||
} | ||||
cin
|
r138 | public void Cancel(Exception reason) { | ||
lock (m_lock) { | ||||
if (!m_cancelled) | ||||
m_cancelled = true; | ||||
} | ||||
} | ||||
cin
|
r25 | protected virtual void OnCancelled() { | ||
var temp = Cancelled; | ||||
if (temp != null) { | ||||
temp(this,new EventArgs()); | ||||
} | ||||
} | ||||
cin
|
r7 | protected virtual void OnMessageUpdated() | ||
{ | ||||
var temp = MessageUpdated; | ||||
if (temp != null) | ||||
{ | ||||
temp(this, new ValueEventArgs<string>(m_message)); | ||||
} | ||||
} | ||||
protected virtual void OnProgressUpdated() | ||||
{ | ||||
var temp = ProgressUpdated; | ||||
if (temp != null) | ||||
{ | ||||
temp(this,new ValueEventArgs<float>(m_current)); | ||||
} | ||||
} | ||||
protected virtual void OnProgressInit() | ||||
{ | ||||
var temp = ProgressInit; | ||||
if (temp != null) | ||||
{ | ||||
temp(this, new ProgressInitEventArgs(m_current,m_max, m_message)); | ||||
} | ||||
} | ||||
} | ||||
} | ||||