Einen wunderschönen guten Morgen,
es geht um folgendes Problem: es stehen mehrere Methoden zur Auswahl. Jede Methode die aufgerufen wird, soll auf ihre Ausführungszeit überwacht
werden und bei Ablauf eines Timeouts nochmal neu gestartet werden. Nach einer bestimmten Anzahl von Versuchen soll die Methode übergangen werden.
Unter C# hab ich das ohne Probleme hingekriegt unter VB nicht. Dazu sei gesagt das ich neu in VB bin und aus der C# Ecke komme.
Beispiele:
Wie man sieht, läuft mein C#-Code schön in den gewollten Timeout, während der VB.Net-Code es nicht macht.
Freundliche Grüße Era
es geht um folgendes Problem: es stehen mehrere Methoden zur Auswahl. Jede Methode die aufgerufen wird, soll auf ihre Ausführungszeit überwacht
werden und bei Ablauf eines Timeouts nochmal neu gestartet werden. Nach einer bestimmten Anzahl von Versuchen soll die Methode übergangen werden.
Unter C# hab ich das ohne Probleme hingekriegt unter VB nicht. Dazu sei gesagt das ich neu in VB bin und aus der C# Ecke komme.
Beispiele:
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace Test
- {
- class Class1
- {
- public delegate void ProcessRequestDelegateWithParam(object data);
- public void DoAllRequests()
- {
- DoRequestWithParam(ProcessRequest,100);
- DoRequestWithParam(ProcessRequest,2500);
- DoRequestWithParam(ProcessRequest,100);
- }
- public void DoRequestWithParam(ProcessRequestDelegateWithParam processRequest,int iMilliseconds)
- {
- bool requestWasSuccesful = false;
- bool requestTimeout = false;
- int numberOfTryings = 0;
- int maxNumberOfTryings = 5;
- int iMillisecondsToTimeOut = 2000;
- do
- {
- Thread workerThread = new Thread(new ParameterizedThreadStart(processRequest));
- workerThread.Start(iMilliseconds);
- System.Threading.Thread.Sleep(iMillisecondsToTimeOut);
- if (workerThread.IsAlive)
- {
- Console.WriteLine("Timed out trying again");
- numberOfTryings++;
- if (numberOfTryings == maxNumberOfTryings)
- {
- requestTimeout = true;
- Console.WriteLine(String.Format("-> Max Tryings reached: {0}", numberOfTryings));
- }
- }
- else
- {
- requestWasSuccesful = true;
- Console.WriteLine(String.Format("-> Single Request success: {0}", requestWasSuccesful));
- }
- }
- while (!requestWasSuccesful && !requestTimeout);
- Console.WriteLine(String.Format("-> Overall Success: {0}", requestWasSuccesful));
- }
- private void ProcessRequest(object str)
- {
- int intStr; bool intResultTryParse = int.TryParse(str.ToString(), out intStr);
- if (intResultTryParse == true)
- {
- System.Threading.Thread.Sleep(intStr);
- }
- }
- }
- }
VB.NET-Quellcode
- Imports System
- Imports System.Collections.Generic
- Imports System.Linq
- Imports System.Text
- Imports System.Threading
- Imports System.Threading.Tasks
- Namespace Test
- Class Class1
- Public Delegate Sub ProcessRequestDelegate(ByVal data As Object)
- Public Sub DoAllRequests()
- DoRequestWithParam(ProcessRequest(100))
- DoRequestWithParam(ProcessRequest(2500))
- DoRequestWithParam(ProcessRequest(100))
- End Sub
- Public Sub DoRequestWithParam(processRequest As [Delegate])
- Dim requestWasSuccesful As Boolean = False
- Dim requestTimeout As Boolean = False
- Dim numberOfTryings As Integer = 0
- Dim maxNumberOfTryings As Integer = 5
- Dim iMillisecondsToTimeOut As Integer = 2000
- Do
- Dim workerThread As Thread = New Thread(New ParameterizedThreadStart(Function() processRequest))
- workerThread.Start()
- System.Threading.Thread.Sleep(iMillisecondsToTimeOut)
- If workerThread.IsAlive Then
- Console.WriteLine("Timed out trying again")
- numberOfTryings = numberOfTryings + 1
- If (numberOfTryings = maxNumberOfTryings) Then
- requestTimeout = True
- Console.WriteLine(String.Format("-> Max Tryings reached: {0}", numberOfTryings))
- End If
- Else requestWasSuccesful = True
- Console.WriteLine(String.Format("-> Single Request success: {0}", requestWasSuccesful))
- End If
- Loop Until requestWasSuccesful Or requestTimeout
- Console.WriteLine(String.Format("-> Overall Success: {0}", requestWasSuccesful))
- End Sub
- Private Function ProcessRequest(ByVal str As Object)
- Dim intStr As Integer
- Dim intResultTryParse As Boolean = Integer.TryParse(str.ToString(), intStr)
- Console.WriteLine(String.Format("-> Process Request time: {0}", intStr))
- System.Threading.Thread.Sleep(intStr)
- End Function
- End Class
- End Namespace
Wie man sieht, läuft mein C#-Code schön in den gewollten Timeout, während der VB.Net-Code es nicht macht.
Freundliche Grüße Era