das
10-03-2014, 06:44
Sto cercando di far sì che una volta caricata la pagina si avvi un thread e che in base al punto in cui è venga aggiornata una label.
Default.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ProgressLabel._Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<div>
<asp:Timer ID="Timer1" runat="server" Interval="300" ontick="Timer1_Tick">
</asp:Timer>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
<ContentTemplate>
<asp:Label ID="lbl_Status" runat="server" Text=""></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</div>
Default.aspx.cs
namespace ProgressLabel
{
public partial class _Default : Page
{
private volatile int a;
private Thread b;
protected void aaa()
{
a = 8;
for (int m = 0; m <= 15; m++)
{
a++;
System.Diagnostics.Debug.WriteLine("AAAAAAAAAA " + a.ToString());
Thread.Sleep(1000);
}
}
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
b = new Thread(aaa);
b.Start();
}
}
protected void Timer1_Tick(object sender, EventArgs e)
{
int c;
c = a;
lbl_Status.Text = c.ToString()+" "+DateTime.Now.Second.ToString();
}
}
}
Il thread parte ed inizia ad aggiornare la variabile 'a' regolarmente. Lo vedo grazie a System.Diagnostics.Debug.WriteLine("AAAAAAAAAA " + a.ToString());.
lbl_Status.Text dovrebbe aggiornarsi ogni 300ms con il valore di a [spazio] secondi orologio di sistema.
Invece i secondi vengono aggiornati regolarmente ma il valore a rimane sempre 0.
Inoltre in .NET il termine 'volatile' nella dichiarazione delle variabili è sufficiente ad evitare collisioni tra i thread ?
Default.aspx
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ProgressLabel._Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<div>
<asp:Timer ID="Timer1" runat="server" Interval="300" ontick="Timer1_Tick">
</asp:Timer>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
<ContentTemplate>
<asp:Label ID="lbl_Status" runat="server" Text=""></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</div>
Default.aspx.cs
namespace ProgressLabel
{
public partial class _Default : Page
{
private volatile int a;
private Thread b;
protected void aaa()
{
a = 8;
for (int m = 0; m <= 15; m++)
{
a++;
System.Diagnostics.Debug.WriteLine("AAAAAAAAAA " + a.ToString());
Thread.Sleep(1000);
}
}
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
b = new Thread(aaa);
b.Start();
}
}
protected void Timer1_Tick(object sender, EventArgs e)
{
int c;
c = a;
lbl_Status.Text = c.ToString()+" "+DateTime.Now.Second.ToString();
}
}
}
Il thread parte ed inizia ad aggiornare la variabile 'a' regolarmente. Lo vedo grazie a System.Diagnostics.Debug.WriteLine("AAAAAAAAAA " + a.ToString());.
lbl_Status.Text dovrebbe aggiornarsi ogni 300ms con il valore di a [spazio] secondi orologio di sistema.
Invece i secondi vengono aggiornati regolarmente ma il valore a rimane sempre 0.
Inoltre in .NET il termine 'volatile' nella dichiarazione delle variabili è sufficiente ad evitare collisioni tra i thread ?