CTT/Unity/Assets/Model/Core/ThreadSynchronizationContex...

72 lines
1.7 KiB
C#
Raw Normal View History

2021-04-08 20:09:59 +08:00
using System;
using System.Collections.Concurrent;
using System.Threading;
namespace ET
{
public class ThreadSynchronizationContext : SynchronizationContext
{
public static ThreadSynchronizationContext Instance { get; } = new ThreadSynchronizationContext(Thread.CurrentThread.ManagedThreadId);
private readonly int threadId;
// 线程同步队列,发送接收socket回调都放到该队列,由poll线程统一执行
private readonly ConcurrentQueue<Action> queue = new ConcurrentQueue<Action>();
private Action a;
public ThreadSynchronizationContext(int threadId)
{
this.threadId = threadId;
}
public void Update()
{
while (true)
{
if (!this.queue.TryDequeue(out a))
{
return;
}
try
{
a();
}
catch (Exception e)
{
Log.Error(e);
}
}
}
public override void Post(SendOrPostCallback callback, object state)
{
this.Post(() => callback(state));
}
public void Post(Action action)
{
if (Thread.CurrentThread.ManagedThreadId == this.threadId)
{
try
{
action();
}
catch (Exception ex)
{
Log.Error(ex);
}
return;
}
this.queue.Enqueue(action);
}
public void PostNext(Action action)
{
this.queue.Enqueue(action);
}
}
}