Как показать всплывающее окно из другого потока на веб-страницах C # .net? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть веб-страница asp.net с главной страницей.На стороне сервера у меня есть консольное приложение, которое взаимодействует с базой данных mssql (периодически вставляйте строки в базу данных).В коде веб-страницы я использую SqlTableDependency, чтобы поймать это действие.Проблема заключается в следующем: я думаю, что для достижения этого мне нужен другой поток в бесконечном цикле, чтобы «слушать» и не блокировать исходный поток пользовательского интерфейса.Я как-то информирую пользователя с помощью какого-то всплывающего окна, что вставка успешно завершена, но, поскольку она работает в другом потоке, у нее вообще не будет доступа к элементам управления Page.Я попробовал 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


  }
}

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Когда вы пишете WebApplication, уже живое взаимодействие с клиентами уже является проблемой.потому что Http не запоминает клиентов.
, поэтому вы должны использовать либо SignalR, либо Ajax (намного проще), чтобы добавить эту возможность в ваше веб-приложение.

вам необходимо сохранить вновь измененные данные (которые поступают из 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, это прямое соединение с каждым клиентом, и вы можете уведомить каждого пользователя по адресукаждый меняется.(но это займет больше времени, чтобы понять)

0 голосов
/ 30 мая 2018

Этого можно достичь двумя возможными способами:

1) Выполнить ajax-вызов сервера на определенный интервал (может быть каждую секунду) и соответствующим образом обновить веб-страницу.

2)Используйте веб-сокеты.проверьте приведенный ниже пример реализации веб-сокетов.https://code.msdn.microsoft.com/The-simple-WebSocket-4524921c

Вы можете найти статьи, связанные с веб-сокетами в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...