aspnetcore/src/Microsoft.AspNet.Server.Kes.../Infrastructure/ThreadPoolActions.cs

74 lines
2.0 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.Server.Kestrel.Http;
namespace Microsoft.AspNet.Server.Kestrel.Infrastructure
{
public class ThreadPoolActions
{
private readonly IKestrelTrace _log;
private readonly WaitCallback _runAction;
private readonly WaitCallback _completeTcs;
public ThreadPoolActions(IKestrelTrace log)
{
_log = log;
// Curry and capture log in closures once
_runAction = (o) =>
{
try
{
((Action)o)();
}
catch (Exception e)
{
_log.ApplicationError(e);
}
};
_completeTcs = (o) =>
{
try
{
((TaskCompletionSource<object>)o).TrySetResult(null);
}
catch (Exception e)
{
_log.ApplicationError(e);
}
};
}
public void Run(Action action)
{
ThreadPool.QueueUserWorkItem(_runAction, action);
}
public void Complete(TaskCompletionSource<object> tcs)
{
ThreadPool.QueueUserWorkItem(_completeTcs, tcs);
}
public void Error(TaskCompletionSource<object> tcs, Exception ex)
{
// ex ang _log are closure captured
ThreadPool.QueueUserWorkItem((o) =>
{
try
{
((TaskCompletionSource<object>)o).TrySetException(ex);
}
catch (Exception e)
{
_log.ApplicationError(e);
}
}, tcs);
}
}
}