如何在 C# .net 网页上显示来自另一个线程的弹出窗口?
How to show popup from another thread on C# .net web pages?
我有一个带有主页的 asp.net 网页。在服务器端,我有与 mssql 数据库交互的控制台应用程序(定期将行插入数据库)。在后面的网页代码中,我使用 SqlTableDependency 来捕获该操作。问题是:我认为要实现这一点,我需要无限循环中的另一个线程 "listen" 并且不阻塞原始 UI 线程。我以某种方式通知用户某种 Popup window,插入已成功完成,但由于它是 运行 在不同的线程上,它根本无法访问页面控件。我尝试了 MessageBox 和 javascript 警报,但没有成功。我做了一些研究,但只在网络表单的情况下得到了答案。有没有办法以某种方式实现这一目标?我也对另一种解决方案感兴趣,但必须在客户端通知用户。这是感兴趣的代码:
public partial class ProdData_Main : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ThreadStart childref2 = new ThreadStart(NotifySqlChanges);
Thread childThread2 = new Thread(childref2);
childThread2.Start();
} else {
//some code which is not important right now...
}
}
public void NotifySqlChanges()
{
string connString = getConnectionString();
var mapper = new ModelToTableMapper<Prod_Data_Business_Object>();
mapper.AddMapping(c => c.Value, "Value");
using (var dep = new SqlTableDependency<Prod_Data_Business_Object>(connString, "Prod_Data_Business_Object", mapper, null, null, TableDependency.Enums.DmlTriggerType.Insert, false))
{
dep.OnChanged += Changed;
dep.Start();
while (true)
{
//here comes the infinity loop which listens for action
}
}
// Debug.WriteLine("terminated");
}
public void Changed(object sender, RecordChangedEventArgs<ProdData_Bus> e)
{
var changedEntity = e.Entity;
//here would be the perfect place to inform user
//got no idea, how... (Controls derive from System.Web.UI thus cannot
//use Invoke, and ScriptManager.RegisterStartupscript not working
}
}
您可以通过两种可能的方式实现此目的:
1) 在特定时间间隔(可能是每秒)对服务器进行一些 ajax 调用,并相应地更新网页。
2) 使用网络套接字。检查下面的 websockets 示例实现。
https://code.msdn.microsoft.com/The-simple-WebSocket-4524921c
您可以在互联网上找到与网络套接字相关的文章。
在您撰写 WebApplication
时,与客户进行实时互动已经成为一个问题。因为 Http 不记得客户端。
因此您必须使用 SignalR
或 Ajax
(更简单)将此功能添加到您的 webApplication。
您需要将新更改的数据(来自 mssql)存储到静态集合中(如 static List<...>
)。 (如果您有多个用户,最好将他们保留在 Session
中)
您的线程会随时填充此集合。你还有另一个页面(我将其命名为 ChangeService
):
public partial class ChangesService : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Here is My changes : blob blob blob :)");
}
}
因此,如果您需要定期获取新更改,Ajax
是您的选择;您可以定期使用 Ajax
调用此页面并向您的客户显示新的更改。
但如果您想尝试 SignalR
它是到每个客户端的直接连接,您可以在每次更改时通知每个用户。 (但需要更多时间去理解)
我有一个带有主页的 asp.net 网页。在服务器端,我有与 mssql 数据库交互的控制台应用程序(定期将行插入数据库)。在后面的网页代码中,我使用 SqlTableDependency 来捕获该操作。问题是:我认为要实现这一点,我需要无限循环中的另一个线程 "listen" 并且不阻塞原始 UI 线程。我以某种方式通知用户某种 Popup window,插入已成功完成,但由于它是 运行 在不同的线程上,它根本无法访问页面控件。我尝试了 MessageBox 和 javascript 警报,但没有成功。我做了一些研究,但只在网络表单的情况下得到了答案。有没有办法以某种方式实现这一目标?我也对另一种解决方案感兴趣,但必须在客户端通知用户。这是感兴趣的代码:
public partial class ProdData_Main : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ThreadStart childref2 = new ThreadStart(NotifySqlChanges);
Thread childThread2 = new Thread(childref2);
childThread2.Start();
} else {
//some code which is not important right now...
}
}
public void NotifySqlChanges()
{
string connString = getConnectionString();
var mapper = new ModelToTableMapper<Prod_Data_Business_Object>();
mapper.AddMapping(c => c.Value, "Value");
using (var dep = new SqlTableDependency<Prod_Data_Business_Object>(connString, "Prod_Data_Business_Object", mapper, null, null, TableDependency.Enums.DmlTriggerType.Insert, false))
{
dep.OnChanged += Changed;
dep.Start();
while (true)
{
//here comes the infinity loop which listens for action
}
}
// Debug.WriteLine("terminated");
}
public void Changed(object sender, RecordChangedEventArgs<ProdData_Bus> e)
{
var changedEntity = e.Entity;
//here would be the perfect place to inform user
//got no idea, how... (Controls derive from System.Web.UI thus cannot
//use Invoke, and ScriptManager.RegisterStartupscript not working
}
}
您可以通过两种可能的方式实现此目的:
1) 在特定时间间隔(可能是每秒)对服务器进行一些 ajax 调用,并相应地更新网页。
2) 使用网络套接字。检查下面的 websockets 示例实现。 https://code.msdn.microsoft.com/The-simple-WebSocket-4524921c
您可以在互联网上找到与网络套接字相关的文章。
在您撰写 WebApplication
时,与客户进行实时互动已经成为一个问题。因为 Http 不记得客户端。
因此您必须使用 SignalR
或 Ajax
(更简单)将此功能添加到您的 webApplication。
您需要将新更改的数据(来自 mssql)存储到静态集合中(如 static List<...>
)。 (如果您有多个用户,最好将他们保留在 Session
中)
您的线程会随时填充此集合。你还有另一个页面(我将其命名为 ChangeService
):
public partial class ChangesService : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Here is My changes : blob blob blob :)");
}
}
因此,如果您需要定期获取新更改,Ajax
是您的选择;您可以定期使用 Ajax
调用此页面并向您的客户显示新的更改。
但如果您想尝试 SignalR
它是到每个客户端的直接连接,您可以在每次更改时通知每个用户。 (但需要更多时间去理解)