Обновление пользовательского интерфейса asp.net с использованием многопоточности - PullRequest
6 голосов
/ 13 мая 2009

У меня есть веб-сайт ASP.NET, содержащий следующее

<asp:UpdatePanel ID="UpdatePanel1" runat="server" >
     <ContentTemplate>
          <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>                
     </ContentTemplate>            
</asp:UpdatePanel>

Я создал функцию потока. И во время выполнения этой функции я хотел бы обновить некоторые элементы управления в пользовательском интерфейсе.

protected void Page_Load(object sender, EventArgs e)
{
    new Thread(new ThreadStart(Serialize_Click)).Start();
}
protected void Serialize_Click()
{
    for (int i = 1; i < 10; i++)
    {
        Label1.Text = Convert.ToString(i);
        UpdatePanel1.Update();
        System.Threading.Thread.Sleep(1000);
    }
}

Как я могу обновить веб-элемент управления во время выполнения потока? мне нужно заставить "UpdatePanel1" постбэк? как?

Ответы [ 3 ]

7 голосов
/ 13 мая 2009

Вам потребуется использовать таймер на стороне клиента (или другой метод), чтобы браузер запросил у сервера обновление, например, в этом упрощенном примере:

<asp:UpdatePanel ID="up" runat="server">        
    <ContentTemplate>
        <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="timer_Ticked" />
        <asp:Label ID="Label1" runat="server" Text="1" />
    </ContentTemplate>
</asp:UpdatePanel>

Тогда в вашем коде:

protected void timer_Ticked(object sender, EventArgs e)
{
    Label1.Text = (int.Parse(Label1.Text) + 1).ToString();
}

Если у вас есть фоновый процесс, который обновляет какое-то состояние, вам нужно будет либо сохранить общее состояние в сеансе, http-кэше или базе данных. Обратите внимание, что срок действия кэша может истекать из-за множества факторов, и фоновые потоки могут быть уничтожены при любой связи, если IIS перезапустит пул приложений.

1 голос
/ 13 мая 2009

Это не будет делать то, что вы думаете.

Было бы более разумно использовать таймер js на внешнем интерфейсе для вызова веб-метода, который обновляет страницу.

Помните, что для сервера после того, как страница отображается, она больше не существует, пока не будет вызвана снова. Сеть является средой без гражданства. Postback и viewstate дают ощущение, что это не так, но это действительно так.

Таким образом, вы не сможете звонить клиенту с сервера, что вы и пытаетесь сделать.

0 голосов
/ 13 мая 2009

Вы должны будете использовать javascript / jquery для опроса сервера на предмет изменений. Это один из наиболее неприятных побочных эффектов всего этого необычного jquery / ajax: люди забывают, что браузер должен опрашивать веб-сервер - это только одностороннее соединение, даже если иногда оно кажется клиентским приложением winforms , В конечном счете, браузер должен сделать запрос http post / get самостоятельно. Да, вы можете отправить клиентский javascript заранее, чтобы он сказал, что это необходимо, но для этого необходимо знать, когда именно нужно перезвонить. Похоже, у вас есть некоторый произвольный код, который будет выполнен, когда он будет сделан, поэтому в этом случае вы должны постоянно опрашивать.

-Oisin

...