private PdnSynchronizationContext(SynchronizationContext prevSyncContext, WaitForMultipleObjectsExDelegate waitForMultipleObjectsExCallback, SleepExDelegate sleepExCallback) { Validate.Begin().IsNotNull <SynchronizationContext>(prevSyncContext, "prevSyncContext").IsNotNull <WaitForMultipleObjectsExDelegate>(waitForMultipleObjectsExCallback, "waitForMultipleObjectsExCallback").IsNotNull <SleepExDelegate>(sleepExCallback, "sleepExCallback").Check(); this.syncThread = Thread.CurrentThread; this.prevSyncContext = prevSyncContext; this.waitForMultipleObjectsExCallback = waitForMultipleObjectsExCallback; this.sleepExCallback = sleepExCallback; this.processQueueCallback = new SendOrPostCallback(this.ProcessQueueCallback); this.processCollatedCallbackCallback = new SendOrPostCallback(this.ProcessCollatedCallback); base.SetWaitNotificationRequired(); }
private static void UnmanagedFunctionPointer() { IntPtr ptrKernel = LoadLibrary("kernel32.dll"); IntPtr ptrSleepEx = GetProcAddress(ptrKernel, "SleepEx"); { SleepExDelegate sleepExFunc = Marshal.GetDelegateForFunctionPointer(ptrSleepEx, typeof(SleepExDelegate)) as SleepExDelegate; Console.WriteLine(DateTime.Now); sleepExFunc(2000, false); Console.WriteLine(DateTime.Now); } unsafe { delegate * unmanaged[Stdcall] < int, bool, int > sleepExFunc = (delegate * unmanaged[Stdcall] < int, bool, int >)ptrSleepEx; Console.WriteLine(DateTime.Now); sleepExFunc(2000, false); Console.WriteLine(DateTime.Now); } unsafe { // System.Runtime.CompilerServices.CallConvStdcall delegate * unmanaged[Stdcall] < void > ptr1 = null; // System.Runtime.CompilerServices.CallConvCdecl delegate * unmanaged[Cdecl] < void > ptr2 = null; // System.Runtime.CompilerServices.CallConvFastcall delegate * unmanaged[Fastcall] < void > ptr3 = null; // System.Runtime.CompilerServices.CallConvThiscall delegate * unmanaged[Thiscall] < void > ptr4 = null; } }
public static PdnSynchronizationContextController Install(WaitForMultipleObjectsExDelegate waitForMultipleObjectsExCallback, SleepExDelegate sleepExCallback) { SynchronizationContext current = SynchronizationContext.Current; if (current == null) { ExceptionUtil.ThrowInvalidOperationException("An SynchronizationContext must already be installed before PdnSynchronizationContext may be installed"); } PdnSynchronizationContext context = new PdnSynchronizationContext(current, waitForMultipleObjectsExCallback, sleepExCallback); if (Interlocked.CompareExchange <PdnSynchronizationContext>(ref instance, context, null) != null) { ExceptionUtil.ThrowInvalidOperationException("Install() may only be called once"); } SynchronizationContext.SetSynchronizationContext(context); context.isInstalled = true; return(new PdnSynchronizationContextController(context)); }