Files
MicrosoftIris/UIX/Microsoft/Iris/Session/DeferredCall.cs
T

179 lines
5.7 KiB
C#
Raw Normal View History

2022-03-03 08:14:05 -06:00
// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Session.DeferredCall
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll
using Microsoft.Iris.Queues;
using Microsoft.Iris.Render;
using System;
using System.Threading;
namespace Microsoft.Iris.Session
{
internal sealed class DeferredCall : QueueItem
{
private const int c_maxCacheCount = 100;
private Delegate _target;
private object _param;
private EventArgs _args;
private static DeferredCall s_cachedList = null;
private static int s_cachedCount = 0;
private static object s_cacheLock = new object();
private DeferredCall()
{
}
private static DeferredCall AllocateFromCache()
{
DeferredCall deferredCall = null;
lock (s_cacheLock)
{
if (s_cachedList != null)
{
deferredCall = s_cachedList;
s_cachedList = (DeferredCall)deferredCall._next;
deferredCall._next = null;
--s_cachedCount;
}
}
deferredCall ??= new DeferredCall();
2022-03-03 08:14:05 -06:00
return deferredCall;
}
public static DeferredCall Create(SimpleCallback callback)
{
DeferredCall deferredCall = AllocateFromCache();
deferredCall._target = callback;
return deferredCall;
}
public static DeferredCall Create(DeferredHandler handler, object param)
{
DeferredCall deferredCall = AllocateFromCache();
deferredCall._target = handler;
deferredCall._param = param;
return deferredCall;
}
public static DeferredCall Create(
EventHandler handler,
object sender,
EventArgs args)
{
DeferredCall deferredCall = AllocateFromCache();
deferredCall._target = handler;
deferredCall._param = sender;
deferredCall._args = args;
return deferredCall;
}
public static DeferredCall Create(IDeferredInvokeItem item)
{
DeferredCall deferredCall = AllocateFromCache();
deferredCall._param = item;
return deferredCall;
}
public override void Dispatch()
{
switch (_target)
2022-03-03 08:14:05 -06:00
{
case SimpleCallback simpleCallback:
simpleCallback();
2022-03-03 08:14:05 -06:00
break;
case DeferredHandler deferredHandler:
deferredHandler(_param);
2022-03-03 08:14:05 -06:00
break;
case EventHandler eventHandler:
eventHandler(_param, _args);
2022-03-03 08:14:05 -06:00
break;
2025-07-15 16:02:21 -05:00
case null when _param is IDeferredInvokeItem deferredInvokeItem:
deferredInvokeItem.Dispatch();
2022-03-03 08:14:05 -06:00
break;
2022-03-03 08:14:05 -06:00
default:
throw new InvalidOperationException($"Unrecognized call target type '{_target?.GetType().Name}'");
2022-03-03 08:14:05 -06:00
}
2022-03-03 08:14:05 -06:00
_target = null;
_param = null;
_args = null;
_prev = null;
_next = null;
_owner = null;
lock (s_cacheLock)
{
if (s_cachedCount >= c_maxCacheCount)
2022-03-03 08:14:05 -06:00
return;
_next = s_cachedList;
s_cachedList = this;
++s_cachedCount;
}
}
public static void Post(DispatchPriority priority, SimpleCallback callback)
{
QueueItem queueItem = Create(callback);
UIDispatcher.Post(priority, queueItem);
}
public static void Post(Thread thread, DispatchPriority priority, SimpleCallback callback)
{
QueueItem queueItem = Create(callback);
UIDispatcher.Post(thread, priority, queueItem);
}
public static void Post(DispatchPriority priority, DeferredHandler handler)
{
QueueItem queueItem = Create(handler, null);
UIDispatcher.Post(priority, queueItem);
}
public static void Post(DispatchPriority priority, DeferredHandler handler, object param)
{
QueueItem queueItem = Create(handler, param);
UIDispatcher.Post(priority, queueItem);
}
public static void Post(TimeSpan delay, DeferredHandler handler, object param)
{
QueueItem queueItem = Create(handler, param);
UIDispatcher.Post(delay, queueItem);
}
public static void Post(
Thread thread,
DispatchPriority priority,
DeferredHandler handler,
object param)
{
QueueItem queueItem = Create(handler, param);
UIDispatcher.Post(thread, priority, queueItem);
}
public override string ToDebugPacketString()
{
2022-06-23 13:19:06 -05:00
string packetString = _target?.Target == null
2022-06-13 01:40:47 -05:00
? string.Empty
: $"{_target.Target}.";
packetString += _target switch
2022-03-03 08:14:05 -06:00
{
SimpleCallback simpleCallback => simpleCallback.Method.Name,
DeferredHandler deferredHandler => $"{deferredHandler.Method.Name}({_param})",
EventHandler eventHandler => $"{eventHandler.Method.Name}({_param}, {_args})",
IDeferredInvokeItem deferredInvokeItem => deferredInvokeItem.ToString(),
2022-03-03 08:14:05 -06:00
_ => throw new InvalidOperationException()
};
return packetString;
2022-03-03 08:14:05 -06:00
}
}
}