TemporarySynchronizationContext

This commit is contained in:
ousttrue 2021-02-16 19:23:40 +09:00
parent 96c01397ce
commit fb78dfbd9d
2 changed files with 72 additions and 0 deletions

View File

@ -0,0 +1,61 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace UniGLTF
{
/// <summary>
/// await で post される先を1次的に乗っ取る
/// </summary>
public class TemporarySynchronizationContext : SynchronizationContext
{
Queue<Action> m_callbacks = new Queue<Action>();
public override void Post(SendOrPostCallback d, object state)
{
m_callbacks.Enqueue(() => d(state));
}
public void ExecuteSync()
{
while (m_callbacks.Count > 0)
{
var callback = m_callbacks.Dequeue();
callback();
}
}
public IEnumerator AsCoroutine()
{
throw new NotImplementedException();
}
public Task AsTask()
{
// repost to SynchronizationContext.Current
throw new NotImplementedException();
}
class Hijacker : IDisposable
{
SynchronizationContext m_backup;
public Hijacker(SynchronizationContext context)
{
m_backup = SynchronizationContext.Current;
SynchronizationContext.SetSynchronizationContext(context);
}
public void Dispose()
{
SynchronizationContext.SetSynchronizationContext(m_backup);
}
}
public IDisposable Hijack()
{
return new Hijacker(this);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 62f8f380aadfc284f9bdc2d58f84bf48
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: