aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Utils/CallbackOnDispose.cs
blob: a6eebf2f1dd68ea89dea4b212e768b68ee78404a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

using System;
using System.Diagnostics;
using System.Threading;

namespace Tango.Scripting.Editors.Utils
{
	/// <summary>
	/// Invokes an action when it is disposed.
	/// </summary>
	/// <remarks>
	/// This class ensures the callback is invoked at most once,
	/// even when Dispose is called on multiple threads.
	/// </remarks>
	sealed class CallbackOnDispose : IDisposable
	{
		Action action;
		
		public CallbackOnDispose(Action action)
		{
			Debug.Assert(action != null);
			this.action = action;
		}
		
		public void Dispose()
		{
			Action a = Interlocked.Exchange(ref action, null);
			if (a != null) {
				a();
			}
		}
	}
}
>new ScriptingEngine(); } private async void Button_Click(object sender, RoutedEventArgs e) { Script s = new Script(); s.Code = @" using System; using System.Windows.Forms; MessageBox.Show(""Hi Roy""); "; try { _session = await _engine.Run(s); _session.StateChanged += Session_StateChanged; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void Session_StateChanged(object sender, ScriptSessionStateChangedEventArgs e) { if (e.State == ScriptSessionState.Completed) { MessageBox.Show(e.ReturnValue.ToString()); } else if (e.State == ScriptSessionState.Aborted) { MessageBox.Show("Aborted"); } else if (e.State == ScriptSessionState.Failed) { MessageBox.Show(e.Exception.ToString()); } } private void Button_Click_1(object sender, RoutedEventArgs e) { _session.Abort(); } } }