EventLoopExtensions
A set of useful extensions for the event loop.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace AngleSharp.Browser
{
public static class EventLoopExtensions
{
public static void Enqueue(this IEventLoop loop, Action action, TaskPriority priority = TaskPriority.Normal)
{
if (loop != null)
loop.Enqueue(delegate {
action();
}, priority);
else
action();
}
public static Task<T> EnqueueAsync<T>(this IEventLoop loop, Func<CancellationToken, T> action, TaskPriority priority = TaskPriority.Normal)
{
if (loop == null)
try {
return Task.FromResult(action(default(CancellationToken)));
} catch (Exception exception) {
return Task.FromException<T>(exception);
}
TaskCompletionSource<T> tcs = (TaskCompletionSource<T>)new TaskCompletionSource<T>();
loop.Enqueue(delegate(CancellationToken c) {
try {
((TaskCompletionSource<T>)tcs).SetResult(action(c));
} catch (Exception exception2) {
((TaskCompletionSource<T>)tcs).SetException(exception2);
}
}, priority);
return ((TaskCompletionSource<T>)tcs).Task;
}
}
}