培训考核三期,新版培训,网页版培训登录器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.0 KiB

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using BestHTTP.Logger;
// Required for ConcurrentQueue.Clear extension.
using BestHTTP.Extensions;
namespace BestHTTP.Core
{
public
#if CSHARP_7_OR_LATER
readonly
#endif
struct ProtocolEventInfo
{
public readonly IProtocol Source;
public ProtocolEventInfo(IProtocol source)
{
this.Source = source;
}
public override string ToString()
{
return string.Format("[ProtocolEventInfo Source: {0}]", Source);
}
}
public static class ProtocolEventHelper
{
private static ConcurrentQueue<ProtocolEventInfo> protocolEvents = new ConcurrentQueue<ProtocolEventInfo>();
private static List<IProtocol> ActiveProtocols = new List<IProtocol>(2);
#pragma warning disable 0649
public static Action<ProtocolEventInfo> OnEvent;
#pragma warning restore
public static void EnqueueProtocolEvent(ProtocolEventInfo @event)
{
if (HTTPManager.Logger.Level == Loglevels.All)
HTTPManager.Logger.Information("ProtocolEventHelper", "Enqueue protocol event: " + @event.ToString(), @event.Source.LoggingContext);
protocolEvents.Enqueue(@event);
}
internal static void Clear()
{
protocolEvents.Clear();
}
internal static void ProcessQueue()
{
ProtocolEventInfo protocolEvent;
while (protocolEvents.TryDequeue(out protocolEvent))
{
if (HTTPManager.Logger.Level == Loglevels.All)
HTTPManager.Logger.Information("ProtocolEventHelper", "Processing protocol event: " + protocolEvent.ToString(), protocolEvent.Source.LoggingContext);
if (OnEvent != null)
{
try
{
OnEvent(protocolEvent);
}
catch (Exception ex)
{
HTTPManager.Logger.Exception("ProtocolEventHelper", "ProcessQueue", ex, protocolEvent.Source.LoggingContext);
}
}
IProtocol protocol = protocolEvent.Source;
protocol.HandleEvents();
if (protocol.IsClosed)
{
ActiveProtocols.Remove(protocol);
HostManager.GetHost(protocol.ConnectionKey.Host)
.GetHostDefinition(protocol.ConnectionKey.Connection)
.TryToSendQueuedRequests();
protocol.Dispose();
}
}
}
internal static void AddProtocol(IProtocol protocol)
{
ActiveProtocols.Add(protocol);
}
internal static void CancelActiveProtocols()
{
for (int i = 0; i < ActiveProtocols.Count; ++i)
{
var protocol = ActiveProtocols[i];
protocol.CancellationRequested();
}
}
}
}