C# 在调用期间在WCF服务中创建后台线程会占用ASP.NET线程池中的线程吗?
以下代码是WCF服务的一部分。eventWatcher是否会占用ASP.NET线程池中的线程,即使它设置为IsBackground=trueC# 在调用期间在WCF服务中创建后台线程会占用ASP.NET线程池中的线程吗?,c#,asp.net,wcf,multithreading,C#,Asp.net,Wcf,Multithreading,以下代码是WCF服务的一部分。eventWatcher是否会占用ASP.NET线程池中的线程,即使它设置为IsBackground=true /// <summary> /// Provides methods to work with the PhoneSystem web services SDK. /// This is a singleton since we need to keep track of what lines (extensions) are open. //
/// <summary>
/// Provides methods to work with the PhoneSystem web services SDK.
/// This is a singleton since we need to keep track of what lines (extensions) are open.
/// </summary>
public sealed class PhoneSystemWebServiceFactory : IDisposable
{
// singleton instance reference
private static readonly PhoneSystemWebServiceFactory instance = new PhoneSystemWebServiceFactory();
private static readonly object l = new object();
private static volatile Hashtable monitoredExtensions = new Hashtable();
private static readonly PhoneSystemWebServiceClient webServiceClient = CreateWebServiceClient();
private static volatile bool isClientRegistered;
private static volatile string clientHandle;
private static readonly Thread eventWatcherThread = new Thread(EventPoller) {IsBackground = true};
#region Constructor
// these constructors are hacks to make the C# compiler not mark beforefieldinit
// more info: http://www.yoda.arachsys.com/csharp/singleton.html
static PhoneSystemWebServiceFactory()
{
}
PhoneSystemWebServiceFactory()
{
}
#endregion
#region Properties
/// <summary>
/// Gets a thread safe instance of PhoneSystemWebServiceFactory
/// </summary>
public static PhoneSystemWebServiceFactory Instance
{
get { return instance; }
}
#endregion
#region Private methods
/// <summary>
/// Create and configure a PhoneSystemWebServiceClient with basic http binding and endpoint from app settings.
/// </summary>
/// <returns>PhoneSystemWebServiceClient</returns>
private static PhoneSystemWebServiceClient CreateWebServiceClient()
{
string url = ConfigurationManager.AppSettings["PhoneSystemWebService_Url"];
if (string.IsNullOrEmpty(url))
{
throw new ConfigurationErrorsException(
"The AppSetting \"PhoneSystemWebService_Url\" could not be found. Check the application configuration and ensure that the element exists. Example: <appSettings><add key=\"PhoneSystemWebService_Url\" value=\"http://xyz\" /></appSettings>");
}
return new PhoneSystemWebServiceClient(new BasicHttpBinding(), new EndpointAddress(url));
}
#endregion
#region Event poller
public static void EventPoller()
{
while (true)
{
if (Thread.CurrentThread.ThreadState == ThreadState.Aborted ||
Thread.CurrentThread.ThreadState == ThreadState.AbortRequested ||
Thread.CurrentThread.ThreadState == ThreadState.Stopped ||
Thread.CurrentThread.ThreadState == ThreadState.StopRequested)
break;
// get events
//webServiceClient.GetEvents(clientHandle, 30, 100);
}
Thread.Sleep(5000);
}
#endregion
#region Client registration methods
private static void RegisterClientIfNeeded()
{
if (isClientRegistered)
{
return;
}
lock (l)
{
// double lock check
if (isClientRegistered)
{
return;
}
//clientHandle = webServiceClient.RegisterClient("PhoneSystemWebServiceFactoryInternal", null);
isClientRegistered = true;
}
}
private static void UnregisterClient()
{
if (!isClientRegistered)
{
return;
}
lock (l)
{
// double lock check
if (!isClientRegistered)
{
return;
}
//webServiceClient.UnegisterClient(clientHandle);
}
}
#endregion
#region Phone extension methods
public bool SubscribeToEventsForExtension(string extension)
{
if (monitoredExtensions.Contains(extension))
{
return false;
}
lock (monitoredExtensions.SyncRoot)
{
// double lock check
if (monitoredExtensions.Contains(extension))
{
return false;
}
RegisterClientIfNeeded();
// open line so we receive events for extension
LineInfo lineInfo;
try
{
//lineInfo = webServiceClient.OpenLine(clientHandle, extension);
}
catch (FaultException<PhoneSystemWebSDKErrorDetail>)
{
// TODO: log error
return false;
}
// add extension to list of monitored extensions
//monitoredExtensions.Add(extension, lineInfo.lineID);
monitoredExtensions.Add(extension, 1);
// start event poller thread if not already started
if (eventWatcherThread.ThreadState == ThreadState.Stopped || eventWatcherThread.ThreadState == ThreadState.Unstarted)
{
eventWatcherThread.Start();
}
return true;
}
}
public bool UnsubscribeFromEventsForExtension(string extension)
{
if (!monitoredExtensions.Contains(extension))
{
return false;
}
lock (monitoredExtensions.SyncRoot)
{
if (!monitoredExtensions.Contains(extension))
{
return false;
}
// close line
try
{
//webServiceClient.CloseLine(clientHandle, (int) monitoredExtensions[extension]);
}
catch (FaultException<PhoneSystemWebSDKErrorDetail>)
{
// TODO: log error
return false;
}
// remove extension from list of monitored extensions
monitoredExtensions.Remove(extension);
// if we are not monitoring anything else, stop the poller and unregister the client
if (monitoredExtensions.Count == 0)
{
eventWatcherThread.Abort();
UnregisterClient();
}
return true;
}
}
public bool IsExtensionMonitored(string extension)
{
lock (monitoredExtensions.SyncRoot)
{
return monitoredExtensions.Contains(extension);
}
}
#endregion
#region Dispose
public void Dispose()
{
lock (l)
{
// close any open lines
var extensions = monitoredExtensions.Keys.Cast<string>().ToList();
while (extensions.Count > 0)
{
UnsubscribeFromEventsForExtension(extensions[0]);
extensions.RemoveAt(0);
}
if (!isClientRegistered)
{
return;
}
// unregister web service client
UnregisterClient();
}
}
#endregion
}
//
///提供使用PhoneSystem web服务SDK的方法。
///这是一个单例,因为我们需要跟踪哪些行(扩展)是开放的。
///
公共密封类PhoneSystemWebServiceFactory:IDisposable
{
//单例实例引用
私有静态只读PhoneSystemWebServiceFactory实例=新PhoneSystemWebServiceFactory();
私有静态只读对象l=新对象();
私有静态易失性哈希表monitoredExtensions=new Hashtable();
私有静态只读电话系统webServiceClient webServiceClient=CreateWebServiceClient();
私有静态易失性bool已注册;
私有静态易失字符串clientHandle;
私有静态只读线程eventWatcherThread=新线程(EventPoller){IsBackground=true};
#区域构造函数
//这些构造函数是使C#编译器不在forefieldinit之前标记的黑客
//更多信息:http://www.yoda.arachsys.com/csharp/singleton.html
静态PhoneSystemWebServiceFactory()
{
}
PhoneSystemWebServiceFactory()
{
}
#端区
#区域属性
///
///获取PhoneSystemWebServiceFactory的线程安全实例
///
公共静态PhoneSystemWebServiceFactory实例
{
获取{return instance;}
}
#端区
#区域私有方法
///
///使用应用程序设置中的基本http绑定和端点创建和配置PhoneSystemWebServiceClient。
///
///PhoneSystemWebServiceClient
私有静态PhoneSystemWebServiceClient CreateWebServiceClient()
{
字符串url=ConfigurationManager.AppSettings[“PhoneSystemWebService_url”];
if(string.IsNullOrEmpty(url))
{
抛出新的ConfigurationErrorsException(
找不到应用程序设置“PhoneSystemWebService\u Url”。请检查应用程序配置并确保元素存在。例如:”;
}
返回新的PhoneSystemWebServiceClient(新的BasicHttpBinding(),新的EndpointAddress(url));
}
#端区
#区域事件轮询器
公共静态void EventPoller()
{
while(true)
{
如果(Thread.CurrentThread.ThreadState==ThreadState.Aborted||
Thread.CurrentThread.ThreadState==ThreadState.AbortRequested||
Thread.CurrentThread.ThreadState==ThreadState.Stopped||
Thread.CurrentThread.ThreadState==ThreadState.StopRequested)
打破
//获取事件
//GetEvents(clientHandle,30100);
}
睡眠(5000);
}
#端区
#区域客户端注册方法
私有静态无效注册表ClientIfRequired()
{
如果(iClientRegistered)
{
返回;
}
锁(l)
{
//双重锁定检查
如果(iClientRegistered)
{
返回;
}
//clientHandle=webServiceClient.RegisterClient(“PhoneSystemWebServiceFactoryInternal”,null);
IsClient注册=真;
}
}
私有静态void UnregisterClient()
{
如果(!IsClient已注册)
{
返回;
}
锁(l)
{
//双重锁定检查
如果(!IsClient已注册)
{
返回;
}
//webServiceClient.UnegisterClient(clientHandle);
}
}
#端区
#区域电话分机方法
公共bool SubscribeToEventsForExtension(字符串扩展)
{
if(monitoredexchanges.Contains(扩展))
{
返回false;
}
锁定(monitoredexchanges.SyncRoot)
{
//双重锁定检查
if(monitoredexchanges.Contains(扩展))
{
返回false;
}
RegisterClientIfNeeded();
//打开线路,以便我们接收扩展事件
LineInfo-LineInfo;
尝试
{
//lineInfo=webServiceClient.OpenLine(clientHandle,扩展名);
}
捕获(错误异常)
{
//TODO:日志错误
返回false;
}
//将扩展添加到受监视扩展的列表中
//添加(扩展名,lineInfo.lineID);
monitoredex.Add(扩展名,1);
//启动事件轮询器线程(如果尚未启动)
if(eventWatcherThread.ThreadState==ThreadState.Stopped | | eventWatcherThread.ThreadState==ThreadState.Unstarted)
{
eventWatcherThread.Start();
}
返回true;
}
}
public bool取消订阅EventsForExtension(字符串扩展名)
{
如果(!monitoredexchanges.Contains(扩展名))
{
返回false;
}
锁定(monitoredexchanges.SyncRoot)
{
如果(!monitoredexchanges.Contains(扩展名))
{
返回false;
}
//近线
尝试
{
//webServiceClient.CloseLine(clientHandle,(int)monitoredex[扩展];
}
捕获(错误异常)
{
//TODO:日志错误
返回false;
}
//从受监视的扩展列表中删除扩展
监视器索引。移除(扩展);
//如果我们没有监视任何其他内容,请停止轮询器并注销客户端
如果(MONITOREDEX.Count==0)
{
活动观察