C#实例上下文同步

创建SyncingClass类,继承与ContextBoundObject,并标记Synchronization特性;

需实现上下文同步的实例必须继承ContextBoundObject和标记Synchronization特性;

using System;
using System.Threading;
using System.Runtime.Remoting.Contexts;
using System.Threading.Tasks;

[Synchronization(true)]
public class SyncingClass : ContextBoundObject
{
    public void Signal()
    {
        Console.WriteLine($"Signalling...");
        Thread.Sleep(500);
    }

    public void DoWait()
    {
        Console.WriteLine($"Waiting...");
        Thread.Sleep(1000);
    }
}

 上下文同步就是指,当该实例在这次线程中有阻塞的行为,而这时有其他线程执行操作也会有阻塞,必须等待其他阻塞行为完成才能执行;

 

public class TestSyncDomainWait
{
    static bool _isDoing = true;

    public static void Main()
    {
        SyncingClass syncClass = new SyncingClass();

        Task.Factory.StartNew(RunWaitKeepContext, syncClass);
        Task.Factory.StartNew(RunWaitLeaveContext, syncClass);

        Console.ReadKey();
        _isDoing = false;
        Console.ReadKey();
    }

    public static void RunWaitKeepContext(object parm)
    {
        while (_isDoing)
        {
            ((SyncingClass)parm).Signal();
        }
    }

    public static void RunWaitLeaveContext(object parm)
    {
        while (_isDoing)
        {
            ((SyncingClass)parm).DoWait();
        }
    }
}

执行上述代码,观察打印信息:

Signalling...
Waiting...
Signalling...
Waiting...
Signalling...
Waiting...
Signalling...
Waiting...
Signalling...
Waiting...
Signalling...
Waiting...
Signalling...
Waiting...
Signalling...
Waiting...

一个线程Sleep 500 ,一个线程 Sleep 1000,但是通过打印信息可以发现两者是交替执行;

 

将SyncingClass类,去除ContextBoundObject继承和Synchronization特性,再次运行观察打印信息:

Signalling...
Waiting...
Signalling...
Waiting...
Signalling...
Signalling...
Waiting...
Signalling...
Signalling...
Waiting...
Signalling...
Signalling...
Waiting...
Signalling...
Signalling...
Waiting...
Signalling...
Signalling...
Waiting...
posted @ 2022-06-22 10:32  Bridgebug  阅读(148)  评论(0编辑  收藏  举报