Exemple #1
0
 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();
 }
Exemple #2
0
    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;
        }
    }
Exemple #3
0
        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));
        }