X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.Remoting.Messaging%2FAsyncResult.cs;h=ff43f8dc0d0301c6df76aaf30b3e6e175dcdb352;hb=f03a1b538bfb0d9be810688e8713731e122320b5;hp=2bf7557dfadf600c37896aa1a8651c55bd2a0b3b;hpb=15af51806d816ad6ad966bc1dfbdd232b63fde52;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.Remoting.Messaging/AsyncResult.cs b/mcs/class/corlib/System.Runtime.Remoting.Messaging/AsyncResult.cs index 2bf7557dfad..ff43f8dc0d0 100644 --- a/mcs/class/corlib/System.Runtime.Remoting.Messaging/AsyncResult.cs +++ b/mcs/class/corlib/System.Runtime.Remoting.Messaging/AsyncResult.cs @@ -39,7 +39,7 @@ namespace System.Runtime.Remoting.Messaging { [System.Runtime.InteropServices.ComVisible (true)] [StructLayout (LayoutKind.Sequential)] -public class AsyncResult : IAsyncResult, IMessageSink { +public class AsyncResult : IAsyncResult, IMessageSink, IThreadPoolWorkItem { #pragma warning disable 169, 414, 649 object async_state; @@ -62,6 +62,7 @@ public class AsyncResult : IAsyncResult, IMessageSink { IMessageCtrl message_ctrl; #pragma warning restore IMessage reply_message; + WaitCallback orig_cb; internal AsyncResult () { @@ -69,10 +70,28 @@ public class AsyncResult : IAsyncResult, IMessageSink { internal AsyncResult (WaitCallback cb, object state, bool capture_context) { + orig_cb = cb; + if (capture_context) { + var stackMark = default (StackCrawlMark); + current = ExecutionContext.Capture ( + ref stackMark, + ExecutionContext.CaptureOptions.IgnoreSyncCtx | ExecutionContext.CaptureOptions.OptimizeDefaultCase); + cb = delegate { + ExecutionContext.Run(current, ccb, this, true); + }; + } + async_state = state; async_delegate = cb; - if (capture_context) - current = ExecutionContext.Capture (); + } + + static internal ContextCallback ccb = new ContextCallback(WaitCallback_Context); + + static private void WaitCallback_Context(Object state) + { + AsyncResult obj = (AsyncResult)state; + WaitCallback wc = obj.orig_cb as WaitCallback; + wc(obj.async_state); } public virtual object AsyncState @@ -185,5 +204,17 @@ public class AsyncResult : IAsyncResult, IMessageSink { get { return call_message; } set { call_message = value; } } + + void IThreadPoolWorkItem.ExecuteWorkItem() + { + Invoke (); + } + + void IThreadPoolWorkItem.MarkAborted(ThreadAbortException tae) + { + } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal extern object Invoke (); } }