如何在C#.net网页上显示另一个线程的弹出窗口?

时间:2018-05-30 14:22:26

标签: c# multithreading user-interface asp.net-webpages

我有一个带有母版页的asp.net网页。在服务器端,我有控制台应用程序,它与mssql数据库交互,(定期向数据库插入行)。在后面的网页代码中,我使用SqlTableDependency来捕获该操作。问题是:我认为要实现这一点,我需要一个无限循环中的另一个线程来“监听”并且不阻止原始的UI线程。我以某种方式通过某种弹出窗口通知用户,插入已成功完成,但由于它在不同的线程上运行,因此根本无法访问Page控件。我试过MessageBox,javascript警告没有运气。我做了一些研究,但只有在webforms的情况下才得到答案。有办法以某种方式实现这一目标吗?我也对另一种解决方案感兴趣,但在客户端通知用户是必须的。以下是感兴趣的代码:

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


  }
}

2 个答案:

答案 0 :(得分:0)

您可以通过两种可能的方式实现这一目标:

1)在特定时间间隔(可能是每秒)对服务器进行一些ajax调用,并相应地更新网页。

2)使用网络套接字。检查下面的websockets示例实现。 https://code.msdn.microsoft.com/The-simple-WebSocket-4524921c

您可以在互联网上找到与网络套接字相关的文章。

答案 1 :(得分:0)

在撰写WebApplication时,与客户进行实时互动已经成为一个问题。因为Http不记得客户 因此,您必须使用SignalRAjax(更简单)将此功能添加到您的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,则可以直接连接到每个客户端,并且您可以在每次更改时通知每个用户。 (但需要更多时间来理解)