void hangupCallback()\r
{\r
Log.WriteLine(LogLevel.Debug, "AppFunction is in hangupCallback.");\r
+ abortRun();\r
var f = HangupFunction;\r
if (f != null) f();\r
}\r
}\r
}\r
\r
+ protected virtual bool AbortOnHangup { get { return false; } }\r
+ bool abortable = false;\r
+ readonly object abortLock = new object();\r
+ Thread runThread;\r
+ void abortRun()\r
+ {\r
+ if (!AbortOnHangup) return;\r
+ lock (abortLock) {\r
+ if (abortable) runThread.Abort();\r
+ }\r
+ }\r
+\r
protected Guid Uuid { get; private set; }\r
\r
internal void RunInternal(FreeSWITCH.Native.MonoSession session, string args)\r
Session.SetDelegates(this.inputCallback, this.hangupCallback);\r
try { this.Uuid = new Guid(Session.GetUuid()); }\r
catch { }\r
- Run();\r
+ try {\r
+ runThread = Thread.CurrentThread;\r
+ lock (abortLock) abortable = true;\r
+ Run();\r
+ }\r
+ catch (ThreadAbortException) {\r
+ Log.WriteLine(LogLevel.Debug, "Run thread aborted.");\r
+ Thread.ResetAbort();\r
+ }\r
+ finally {\r
+ lock (abortLock) { abortable = false; }\r
+ Thread.ResetAbort();\r
+ }\r
}\r
\r
protected abstract void Run();\r