Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调用期间在WCF服务中创建后台线程会占用ASP.NET线程池中的线程吗?_C#_Asp.net_Wcf_Multithreading - Fatal编程技术网

C# 在调用期间在WCF服务中创建后台线程会占用ASP.NET线程池中的线程吗?

C# 在调用期间在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. //

以下代码是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>
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)
{
活动观察