38 lines
1.1 KiB
C#
38 lines
1.1 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Concurrent;
|
||
using System.Threading;
|
||
|
||
namespace YooAsset
|
||
{
|
||
/// <summary>
|
||
/// 同步其它线程里的回调到主线程里
|
||
/// 注意:Unity3D中需要设置Scripting Runtime Version为.NET4.6
|
||
/// </summary>
|
||
internal sealed class ThreadSyncContext : SynchronizationContext
|
||
{
|
||
private readonly ConcurrentQueue<Action> _safeQueue = new ConcurrentQueue<Action>();
|
||
|
||
/// <summary>
|
||
/// 更新同步队列
|
||
/// </summary>
|
||
public void Update()
|
||
{
|
||
while (true)
|
||
{
|
||
if (_safeQueue.TryDequeue(out Action action) == false)
|
||
return;
|
||
action.Invoke();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 向同步队列里投递一个回调方法
|
||
/// </summary>
|
||
public override void Post(SendOrPostCallback callback, object state)
|
||
{
|
||
Action action = new Action(() => { callback(state); });
|
||
_safeQueue.Enqueue(action);
|
||
}
|
||
}
|
||
} |