2009-11-18 1 views
0

J'ai demandé un plusieurs fois, mais doit demander à nouveau, parce que je ne sais pas quoi faire: Sur ma page, j'ai un système de vente aux enchères.Requête de base de données et compte à rebours avec Ajax dans ASP.Net ~ Problème dur

Chaque seconde, je dois:

  • obtenir des informations si une offre publique d'enchérisseur sur elle -> Base de données de requête
  • Compte à rebours de la minuterie moins 1 seconde
  • mise à jour de quelques panneaux avec des informations s'il y a une nouvelle soumissionnaire (historique qui est montré, blanquette)

problème Mon (drôle) est, que seule une minuterie simple, ASP.Net Ajax (que je dois avoir, je pense, parce que je besoin du DAL et ainsi de suite) dans un UpdatePanel avec Seulement le Label-Timer et un compte à rebours de ce besoin plus de 1 seconde unique ...

Cela signifie que lorsque j'exécute la minuterie, qui convertit uniquement l'étiquette en DateTime, supprimer 1 seconde et mettre à jour l'étiquette, en 10 secondes normales, il ne fonctionne pas 10 fois, seulement 8 fois.

Donc, en 10 secondes je perds 2 secondes ...

Je ne veux pas l'image quand je commence à interroger la base de données ....

Que faire? J'ai découvert que ce n'est pas la performance qui est trop lente. La minuterie ne démarre pas toutes les secondes.

J'ai rempli un Debug.WriteLine avec milliseconde début et la fin de la tique de la minuterie, voici 3 exemples:

  • 2009.11.18 13: 13: 21: 1821
  • 2009.11.18 13:13 : 21: 1821
  • 18/11/2009 13: 13: 22: 7021
  • 18/11/2009 13: 13: 22: 7021
  • 18/11/2009 13: 13: 24: 2421
  • 18/11/2009 13 : 13: 24: 2421

Il fin en quelques millisecondes, mais il recommence pas à droite intervall (1000 millisecondes doit-il être!)


Comme souhaité le code:

 protected void Timer1_Tick(object sender, EventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss:ffff")); 
     DateTime dt = DateTime.Parse(lblTimer.Text); 
     dt = dt.AddSeconds(-1.0); 
     lblTimer.Text = dt.ToString("HH:mm:ss"); 
     System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss:ffff")); 
    } 

2)

      <asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server"> 
<ContentTemplate> 
    <asp:Timer ID="timeAD" Interval="1000" Enabled="true" runat="server" ontick="Timer1_Tick"> 
</asp:Timer> 
<asp:Label ID="lblTimer" runat="server" Text="Label"></asp:Label> 
</ContentTemplate> 
</asp:UpdatePanel> 
+0

Je demanderais au serveur de fournir tous les détails pertinents, c'est-à-dire les enchères sur l'article et le temps d'enchères restant. Le client ne devrait pas faire ce calcul pour la raison que vous avez décrite, le système client doit seulement être fortement chargé et vous commencerez à manquer des cycles. – Lazarus

+0

Oui de maudire le serer faire le calcul et ainsi de suite, c'est dans une classe Business. – Kovu

+0

Alors, comment perdez-vous votre temps? – Lazarus

Répondre

1

Je connais la réponse maintenant: la minuterie est en U pdate-Panel, de sorte que le temps de passage de 300 millisecondes sera ajouté, car la minuterie redémarre chaque publication imaginaire.

Mettez la minuterie hors du panneau de mise à jour et obtenez un déclencheur dans le panneau -> Win. La minuterie se déclenche toutes les secondes.