[www] wywołanie funkcji po określonym czasie

0

Tworzę aplikację WWW w VS 2008 C#. W jaki sposób można spowodować, aby dana funkcja została wywołana np. po 3 minutach od kliknięcia przycisku?

0

tworzysz jakąś metodę w ktorej masz sleep(trzy minuty)
tworzysz callbacka w ktorym wywołujesz funkcję kluczową.

podpinasz metodę pierwszą pod delegata
wywołujesz delegata poprzez BeginInvoke jako parametry (ewentualne paramatry metody i) callbacka.
jak pierwsza funkcja sie skonczy, zostanie wywołany callback

Nie jestem pewien, ale być może dało by się to także zrobić korzystając z klasy ThreadPool.

0
dark_astray napisał(a)

tworzysz jakąś metodę w ktorej masz sleep(trzy minuty)
tworzysz callbacka w ktorym wywołujesz funkcję kluczową.

podpinasz metodę pierwszą pod delegata
wywołujesz delegata poprzez BeginInvoke jako parametry (ewentualne paramatry metody i) callbacka.
jak pierwsza funkcja sie skonczy, zostanie wywołany callback

mógłby ktoś podać kod?

0

Sleep(3601000)
a gdzie jest metoda sleep powie ci msdn
ale sugeruje uzycie timera

0

z Timerem nie działa:

    protected void Timer1_Tick(object sender, EventArgs e)
    {
       
        min = int.Parse(Labelmin.Text);
        sek = int.Parse(Labelsek.Text);

if (min == 0 && sek == 0)
    
        {
        this.Button1_Click(sender,e);
                
          
       }


        if (sek > 0)
        {
            sek--;
        }


        if (sek == 0)
        {

            if (min > 0)
            {

                min--;

                sek = 59;
            }

}
    
      Labelsek.Text = sek.ToString();
      Labelmin.Text = min.ToString();
    }

    protected void Timer1_Init(object sender, EventArgs e)
    {
        min = 0;
        sek = 3;
        Labelmin.Text = "0";
        Labelsek.Text = "3";
    }

   


}
0

W .NET-cie nie ma jak w innych jezykach po prostu Sleep(iles tam) tylko jeśli już statyczna metoda klasy Thread.

Zrób linijke przed wywołaniem metody

int delay = 58000 ; // czyli seukundy * 1000;
System.Threading.Thread.Sleep(delay); // zatrzymuje pracę programu na 58 sekund
MojaFunkcja();

Niestety zblokuje ci to całą aplikację (bo pewnie masz w 1 wątku) ,więc raczej nie o to Ci chodzi. Musiałbyś spróbować z ThreadPool albo z ajaxowym timerem wrzuconym oczywiście do UpdatePanela + ScriptManager na stronie :)

0

dobra chyba sie nie wczytalem uwaznie w problem (jak zwykle ;) )
na stronie www masz przycisk i chcesz aby dzialalo to tak: user klika sobie w przycisk i po X czasie (3 min.) uruchamia sie jakas funkcja, ale jesli user zamknie strone (zamknie okno/tab przegladarki, przejdzie na inna strone) ta funkcja juz nie musi sie wykonac
jesli tak, to na onclick przycisku dajesz jakis kod js, ktory odpala timer, a w funkcji wykonwywanej po uplywie czasu robisz wywolanie ajaxem metody na serwerze

<input type="button" value="Kliknij mnie" onclick="setTimeout(CallServerMethod(),3000)" /> <script> function CallServerMethod() { ... teraz tu musi byc ajax'owe odpytanie do serwera } </script>
0
massther napisał(a)

dobra chyba sie nie wczytalem uwaznie w problem (jak zwykle ;) )
na stronie www masz przycisk i chcesz aby dzialalo to tak: user klika sobie w przycisk i po X czasie (3 min.) uruchamia sie jakas funkcja, ale jesli user zamknie strone (zamknie okno/tab przegladarki, przejdzie na inna strone) ta funkcja juz nie musi sie wykonac

nie, od momentu załadowania się strony po 3 minutach aplikacja "sama" klika w przycisk, ale user może sam wcześniej go przycisnąć

0

Co się dzieje jak klikniesz przycisk ? Przeładowuje się cała strona czy działa tam gdzieś jakiś Ajax ?

0

zmienia się View strony za pomocą SetActiveView

0

no to setTimeout(3601000, mojaFunkcja) na np. onload body

0

Nie może być Timer po stronie serwera! .. nigdy nie będzie działać.

Tylko setTimeout() Javascript'owy.

0

tylko jak do jednego buttona ustawić dwie akcje (C# i js)?

mam buttona, którego jak wcisnę, to zmienia się View strony i od tego momentu po 3 minutach ma się automatycznie wcisnać przycisk który zmieni View na inny

jak napiszę tak:
<input type="button" onclick="setTimeout(..., 5000)" />

to nie wywoła mi się funkcja Button1_Click z pliku aspx.cs, po drugie jak zapisać w pierwszym argumencie SetTimeout, żeby wywołała się funkcja Button2_Click zamiast np. alert('')?

0

Jesli juz koniecznie chesz to zrobic bez javascriptu to stworz sobie update panel z timerem i multiview który chcesz zmieniać (przycisk poza updatepanelem),który w zdarzeniu tick kontrolki timer będzie wywoływał tą samą funkcje co kliknięcie przycisku. Potrzeba też jakos zabezpieczyć ,żeby przy 1 wywołaniu nic nie zmieniało.Napisałem coś takiego , u mnie działa tak jak opisałeś. Co kilka sekund zmienia mi się view ,ale mogę go też zmienić przyciskiem.

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            MultiView1.SetActiveView(View1);

            Session.Add("bclick", false);
        }

        //Timer1.Interval = 180000;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if(MultiView1.ActiveViewIndex == 0)
        MultiView1.SetActiveView(View2);
        else
            MultiView1.SetActiveView(View1);
       
    }

    protected void Timer1_Tick(object sender, EventArgs e)
    {
        if ((bool)Session["bclick"] == true)
        {
            if (MultiView1.ActiveViewIndex == 0)
                MultiView1.SetActiveView(View2);
            else
                MultiView1.SetActiveView(View1);

            
        }
        
            Session["bclick"] = true;
    }

Za 1 tickiem się nie zmieni , a po 3 minutach jesli nikt nie kliknie zmieni się na View2. Jeśli ktoś kliknie przycisk po 2 minutach to przeładuje się strona, zmieni widok i po 3 minutach ponownie...

W html-u mniej więce tak :

 <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" 
        onload="UpdatePanel1_Load">
    
    <ContentTemplate>
        <asp:Timer ID="Timer1" runat="server" Enabled="true" Interval="15000" 
            ontick="Timer1_Tick" >
        </asp:Timer>
   
      
        <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
            <asp:View ID="View1" runat="server">
                <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
            </asp:View>
              <asp:View ID="View2" runat="server">
                  <asp:ListBox ID="ListBox1" runat="server" Width="980px"></asp:ListBox>
        </asp:View>
        </asp:MultiView>
    </ContentTemplate>
    </asp:UpdatePanel>

Jak cos nie tak to pisz

0
Lamson napisał(a)

Jeśli ktoś kliknie przycisk po 2 minutach to przeładuje się strona, zmieni widok i po 3 minutach ponownie...

Strona jest podzieloba na trzy różne View - najpierw pokazuje się pierwszy z buttonem, po kliknięciu buttona pojawia się drugi View na którym jest umieszczony stoper który odlicza od 3:00 (3 minut) do 0:00; gdy timer dojdzie do zera to ma się sam wcisnąć przycisk umieszczony pod tym timerem, który zmienia View na trzeci, ale ktoś wcześniej może przycisnąć przycisk i zmienić View na trzeci

0

jeśli nie można zrobić Timera po stronie serwera, to jak można to inaczej zrobić?

//q: timerem po stronie klienta..

1 użytkowników online, w tym zalogowanych: 0, gości: 1