2013-07-31 2 views
0

J'ai besoin d'effectuer une tâche à un certain moment en utilisant l'utilisation des heures et des minutes saisies par l'utilisateur.VB.net Effectuer une tâche à l'heure planifiée

Je pense à quelque chose comme en utilisant une sorte de boucle qui chaque fois il boucle, vérifie si les Now().Hour matchs HourChoice et Now().Minute correspond à la MinuteChoice

j'ai aussi En cela, une option utilisateur de choisir " AM "ou" PM ", et si TimeOfDay = "PM", ajoutez 12 heures (le Now().Hour est l'heure militaire).

EDIT: Je veux seulement que cela fonctionne une fois à la fois, pas tous les jours.

+0

S'agit-il d'une application Web, d'une application de bureau ou d'un service? – randcd

+0

@randcd une application de bureau vb.net – user2620851

+0

pour référence: [Créer une tâche planifiée à l'aide de VB.net] (https://stackoverflow.com/q/20677722/327083) –

Répondre

0

Vous n'avez pas à boucler,
Ajoutez simplement un temporisateur à votre formulaire, réglez son intervalle à 500 pour qu'il se déclenche toutes les 500 millisecondes.
Activez-le via un bouton pour démarrer votre tâche.

ensuite sur votre Timer.Tick événement:

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
     If Hour(Now) = HourChoice And Minute(Now) = MinuteChoice Then 
      'Your Task Here 
     End If 
    End Sub 
+2

Je voudrais créer une minuterie, et mettre sa coche à la Temps donné pour attendre en millisecondes. Lorsque la minuterie est appelée, vous arrêtez la minuterie. –

+0

C'est une meilleure approche @DavidSdot –

+0

comment puis-je l'activer et régler la minuterie? – user2620851

1

Vous pouvez utiliser un System.Threading.Timer pour le faire. Au lieu d'une boucle qui s'exécute et dort constamment, vous pouvez définir l'intervalle sur Timer comme étant la différence entre maintenant et l'heure sélectionnée et le TimerCallback comme étant le Sub qui exécute la tâche. Définir le délai d'attente à 0 ou Timeout.Infinite s'assurera que cela est seulement exécuté une fois.

EDIT: Exemple

Dim tcb As TimerCallback = AddressOf DoStuff 
Dim t As Timer 
Dim execTime As TimeSpan 
Dim dtNow As DateTime = DateTime.Now 
Dim hc As Integer = HourChoice 
Dim mc As Integer = MinuteChoice 

If TimeOfDay = "AM" And hc = 12 Then 
    hc = 0 
Else If TimeOfDay = "PM" Then 
    hc = hc + 12 
End If 

Dim dtCandidate As DateTime = New DateTime(dtNow.Year, dtNow.Month, dtNow.Day, hc, mc, 0) 

If dtCandidate < dtNow Then 
    dtCandidate.AddDays(1) 
End If 

execTime = dtCandidate.Subtract(dtNow) 
t = New Timer(tcb,Nothing,execTime,TimeSpan.Zero) 

Ensuite, vous avez juste besoin d'un Sous faire votre tâche:

Public Sub DoStuff(obj As Object) 
'...Do Some Kind of Work 
End Sub 
+0

Voulez-vous s'il vous plaît me donner un exemple? – user2620851

+0

Mise à jour avec l'exemple.Tu devras excuser mon VB Je suis un peu rouillé ... – randcd

0

Non testé mais cela devrait fonctionner. Dans le TimeSpan, vous pouvez définir des jours, des heures, des minutes, des secondes.

Private timer As System.Threading.Timer = New System.Threading.Timer(AddressOf DoWhatever, Nothing, New TimeSpan(0, 10, 0, 0), -1) 

Private Sub dowhatever(sender As Object, e As Timers.ElapsedEventArgs) 
    ' Do stuff 
End Sub 

Plus se trouvent sur MSDN

0

Un peu tard pour ajouter une réponse à cette question, mais: Vous pouvez utiliser un System.Windows.Forms.Timer standard. Définissez l'intervalle à la différence en millisecondes entre le temps requis et Now(), puis démarrez le temporisateur.