Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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
Asp.net Windows 8.1/IIS 8.5.9600.16384上的信号器和SQLDependency性能问题_Asp.net_Signalr_Real Time_Signalr Hub_Sqldependency - Fatal编程技术网

Asp.net Windows 8.1/IIS 8.5.9600.16384上的信号器和SQLDependency性能问题

Asp.net Windows 8.1/IIS 8.5.9600.16384上的信号器和SQLDependency性能问题,asp.net,signalr,real-time,signalr-hub,sqldependency,Asp.net,Signalr,Real Time,Signalr Hub,Sqldependency,我刚刚开始开发一个POC,用于实现Signalr2+SQL依赖关系,以控制实时仪表板(尽管我正在开发的POC与项目要求略有不同) 此POC测量每个逻辑核心的服务器CPU使用率 POC测试页面预览 我已经成功地实现了依赖项预览,我可以在测试html页面上看到实时预览,在本地SQL DB中进行任何更改的那一刻 这些更改由独立的命令行应用程序通过简单的更新查询进行更新。我的数据库也有一个4列的简单单行结构(至少目前是这样) 问题是,通过“dependency_OnChange”事件触发20-30次

我刚刚开始开发一个POC,用于实现Signalr2+SQL依赖关系,以控制实时仪表板(尽管我正在开发的POC与项目要求略有不同)

此POC测量每个逻辑核心的服务器CPU使用率

POC测试页面预览

我已经成功地实现了依赖项预览,我可以在测试html页面上看到实时预览,在本地SQL DB中进行任何更改的那一刻

这些更改由独立的命令行应用程序通过简单的更新查询进行更新。我的数据库也有一个4列的简单单行结构(至少目前是这样)

问题是,通过“dependency_OnChange”事件触发20-30次更改后,CPU使用率会下降95-100%(即使只有Visual Studio和单个浏览器处于打开状态,并且命令行应用程序正在运行以进行更新)

后震波预览

我正在Windows 8.1和IIS 8.5中使用Visual Studio(2015社区版)。POC页作为“”运行,尚未托管在IIS中

我尝试了这里描述的解决方案:

同时也在寻找解决方案:

我还不知道,还没有什么新奇的东西(如果性能很好,将在Asp.NETMVC下实现),但即使是最简单的愚蠢的东西也不会带来好运

Global.asax的代码

protected void Application_Start(object sender, EventArgs e)
{
    SqlDependency.Start(connString);
}

protected void Application_End(object sender, EventArgs e)
{
    SqlDependency.Stop(connString);
}
Startup.cs的代码

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
        app.MapSignalR();
    }
}
集线器类的代码

public class AppHub : Hub
    {
        private static string conString = ConfigurationManager.ConnectionStrings["DBConn"].ToString();

        [HubMethodName("sendMessages")]
        public static void SendMessages()
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<AppHub>();
            context.Clients.All.updateMessages();
        }
    }
SQL依赖项的代码

        public class CPUUsage
        {
            public string Core1Usage { get; set; }
            public string Core2Usage { get; set; }
            public string Core3Usage { get; set; }
            public string Core4Usage { get; set; }
        }

    public class CPUUsageHistory
    {
        readonly string _connString = ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString;

        public IEnumerable<CPUUsage> GetAllMessages()
        {
            var cpuusage = new List<CPUUsage>();

            using (var connection = new SqlConnection(_connString))
            {
                connection.Open();
                using (var command = new SqlCommand(@"SELECT [Core1Usage],[Core2Usage],[Core3Usage],[Core4Usage]  FROM [dbo].[CpuUsageDetails]", connection))
                {
                    command.Notification = null;

                    var dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                    if (connection.State == ConnectionState.Closed)
                        connection.Open();

                    var reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        cpuusage.Add(item: new CPUUsage
                        {
                            Core1Usage = reader["Core1Usage"].ToString(),
                            Core2Usage = reader["Core2Usage"].ToString(),
                            Core3Usage = reader["Core3Usage"].ToString(),
                            Core4Usage = reader["Core4Usage"].ToString()
                        });
                    }
                }

            }
            return cpuusage;


        }
        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            if (e.Type == SqlNotificationType.Change)
            {
                AppHub.SendMessages();
            }
        }
    }
}
公共类CPUUsage
{
公共字符串Core1Usage{get;set;}
公共字符串Core2Usage{get;set;}
公共字符串Core3Usage{get;set;}
公共字符串Core4Usage{get;set;}
}
公共类CPUU历史
{
只读字符串_connString=ConfigurationManager.ConnectionString[“DBConn”].ConnectionString;
公共IEnumerable GetAllMessages()
{
var cpuusage=新列表();
使用(var连接=新的SqlConnection(_connString))
{
connection.Open();
使用(var命令=新的SqlCommand(@“从[dbo].[CpuUsageDetails]”中选择[Core1Usage]、[Core2Usage]、[Core3Usage]、[Core4Usage]”,连接))
{
command.Notification=null;
var-dependency=newsqldependency(命令);
dependency.OnChange+=新的OnChangeEventHandler(dependency\u OnChange);
if(connection.State==ConnectionState.Closed)
connection.Open();
var reader=command.ExecuteReader();
while(reader.Read())
{
添加(项目:新cpuusage
{
Core1Usage=读卡器[“Core1Usage”]。ToString(),
Core2Usage=读卡器[“Core2Usage”]。ToString(),
Core3Usage=读卡器[“Core3Usage”]。ToString(),
Core4Usage=reader[“Core4Usage”].ToString()
});
}
}
}
返回cpuusage;
}
private void dependency_OnChange(对象发送方,SqlNotificationEventArgs e)
{
if(e.Type==SqlNotificationType.Change)
{
AppHub.SendMessages();
}
}
}
}

我错过了什么/做错了什么?

你能做的事情很少

  • 延迟命令行工具执行的更新查询,以避免频繁更新。例如,在执行更新查询之前至少等待200毫秒。如果在这200毫秒内,有任何新的更新,则忽略上一个计时器并将其重新设置200毫秒。我理解此解决方案可能不适合您的应用程序,因为它会增加200毫秒的延迟来更新客户端,而不是实时更新

  • 每当SQL数据库发生任何更改时,为什么不直接与中心通信呢。我的意思是,命令行工具可以直接向中心提供更新,而不是从SqlDependency更改事件获取信息


  • 有2-3个浏览器实例(主要是Chrome48)。。。如果与.1一起使用,系统阻塞和Firefox45b崩溃。我确实勾选了那个选项。2.我将很快检查集线器更新选项。
    public class AppData : IHttpHandler
            {
    
                public void ProcessRequest(HttpContext context)
                {
                    context.Response.ContentType = "text/json";
                    CPUUsageHistory _messageRepository = new CPUUsageHistory();
                    context.Response.Write(
                        JsonConvert.SerializeObject(_messageRepository.GetAllMessages()));
                }
    
                public bool IsReusable
                {
                    get
                    {
                        return true;
                    }
                }
            }
    
            public class CPUUsage
            {
                public string Core1Usage { get; set; }
                public string Core2Usage { get; set; }
                public string Core3Usage { get; set; }
                public string Core4Usage { get; set; }
            }
    
        public class CPUUsageHistory
        {
            readonly string _connString = ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString;
    
            public IEnumerable<CPUUsage> GetAllMessages()
            {
                var cpuusage = new List<CPUUsage>();
    
                using (var connection = new SqlConnection(_connString))
                {
                    connection.Open();
                    using (var command = new SqlCommand(@"SELECT [Core1Usage],[Core2Usage],[Core3Usage],[Core4Usage]  FROM [dbo].[CpuUsageDetails]", connection))
                    {
                        command.Notification = null;
    
                        var dependency = new SqlDependency(command);
                        dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
    
                        if (connection.State == ConnectionState.Closed)
                            connection.Open();
    
                        var reader = command.ExecuteReader();
    
                        while (reader.Read())
                        {
                            cpuusage.Add(item: new CPUUsage
                            {
                                Core1Usage = reader["Core1Usage"].ToString(),
                                Core2Usage = reader["Core2Usage"].ToString(),
                                Core3Usage = reader["Core3Usage"].ToString(),
                                Core4Usage = reader["Core4Usage"].ToString()
                            });
                        }
                    }
    
                }
                return cpuusage;
    
    
            }
            private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
            {
                if (e.Type == SqlNotificationType.Change)
                {
                    AppHub.SendMessages();
                }
            }
        }
    }