コード例 #1
0
    public void CreateCopy_ReturnsNewInstance()
    {
        var syncContext = new SingleThreadedSynchronizationContext();
        var other       = syncContext.CreateCopy();

        Assert.NotSame(syncContext, other);

        // Verify that posting to the copy effectively gets the work to run on the original thread.
        var frame            = new SingleThreadedSynchronizationContext.Frame();
        int?observedThreadId = null;

        Task.Run(() =>
        {
            other.Post(
                s =>
            {
                observedThreadId = Environment.CurrentManagedThreadId;
                frame.Continue   = false;
            },
                null);
        });

        syncContext.PushFrame(frame);
        Assert.Equal(Environment.CurrentManagedThreadId, observedThreadId.Value);
    }
コード例 #2
0
    public void Send_OnDifferentThread_ExecutesDelegateAndWaits_Throws()
    {
        int originalThreadId = Environment.CurrentManagedThreadId;
        var syncContext      = new SingleThreadedSynchronizationContext();
        var frame            = new SingleThreadedSynchronizationContext.Frame();

        var task = Task.Run(delegate
        {
            try
            {
                var expectedException = new InvalidOperationException();
                var actualException   = Assert.Throws <TargetInvocationException>(() => syncContext.Send(s => throw expectedException, null));
                Assert.Same(expectedException, actualException.InnerException);
            }
            finally
            {
                frame.Continue = false;
            }
        });
コード例 #3
0
    public void Send_OnDifferentThread_ExecutesDelegateAndWaits()
    {
        int originalThreadId = Environment.CurrentManagedThreadId;
        var syncContext      = new SingleThreadedSynchronizationContext();
        var frame            = new SingleThreadedSynchronizationContext.Frame();

        var task = Task.Run(delegate
        {
            try
            {
                int?observedThreadId = null;
                syncContext.Send(s => observedThreadId = Environment.CurrentManagedThreadId, null);
                Assert.Equal(originalThreadId, observedThreadId);
            }
            finally
            {
                frame.Continue = false;
            }
        });

        syncContext.PushFrame(frame);
        task.GetAwaiter().GetResult();
    }