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...