PageRenderTime 79ms CodeModel.GetById 74ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Manos/Manos/Timeout.cs

http://github.com/jacksonh/manos
C# | 99 lines | 44 code | 12 blank | 43 comment | 2 complexity | 9bd40df0ac3d1f9f83d06c12c48395e3 MD5 | raw file
 1//
 2// Copyright (C) 2010 Jackson Harper (jackson@manosdemono.com)
 3//
 4// Permission is hereby granted, free of charge, to any person obtaining
 5// a copy of this software and associated documentation files (the
 6// "Software"), to deal in the Software without restriction, including
 7// without limitation the rights to use, copy, modify, merge, publish,
 8// distribute, sublicense, and/or sell copies of the Software, and to
 9// permit persons to whom the Software is furnished to do so, subject to
10// the following conditions:
11// 
12// The above copyright notice and this permission notice shall be
13// included in all copies or substantial portions of the Software.
14// 
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22//
23//
24
25using System;
26
27
28namespace Manos
29{
30	/// <summary>
31	/// Provides a mechanism for things to happen periodically within a ManosApp. 
32	/// Timeouts are gauranteed to happen at some moment on or after the TimeSpan specified has ellapsed.
33	/// 
34	/// Timeouts will never run before the specified TimeSpan has elapsed.
35	/// 
36	/// Use the method <see cref="M:Manos.AppHost.AddTimeout"/> method to register each Timeout.
37	/// </summary>
38	public class Timeout
39	{
40		internal TimeSpan begin;
41		internal TimeSpan span;
42		internal IRepeatBehavior repeat;
43		internal object data;
44		internal TimeoutCallback callback;
45
46		private bool stopped;
47
48		public Timeout (TimeSpan span, IRepeatBehavior repeat, object data, TimeoutCallback callback) : this (TimeSpan.Zero, span, repeat,data, callback)
49		{
50		}
51
52		public Timeout (TimeSpan begin, TimeSpan span, IRepeatBehavior repeat, object data, TimeoutCallback callback)
53		{
54			this.begin = begin;
55			this.span = span;
56			this.repeat = repeat;
57			this.data = data;
58			this.callback = callback;
59		}
60		
61		/// <summary>
62		/// Causes the action specified in the constructor to be executed. Infrastructure.
63		/// </summary>
64		/// <param name="app">
65		/// A <see cref="ManosApp"/>
66		/// </param>
67		public void Run (ManosApp app)
68		{
69			if (stopped)
70				return;
71
72			try {
73				callback (app, data);
74			} catch (Exception e) {
75				Console.Error.WriteLine ("Exception in timeout callback.");
76				Console.Error.WriteLine (e);
77			}
78			
79			repeat.RepeatPerformed ();
80		}
81
82		/// <summary>
83		/// Stop the current timeout from further execution.  Once a timeout is stopped it can not be restarted
84		/// </summary>
85		public void Stop ()
86		{
87			stopped = true;
88		}
89
90		/// <summary>
91		/// Inidicates that the IOLoop should retain this timeout, because it will be run again at some point in the future. Infrastructure.
92		/// </summary>
93		public bool ShouldContinueToRepeat ()
94		{
95			return !stopped && repeat.ShouldContinueToRepeat ();	
96		}
97	}
98}
99