Wird Threading in VB.net anders behandelt als in C#?

  • C#
  • .NET (FX) 4.5–4.8

    Wird Threading in VB.net anders behandelt als in C#?

    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:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading;
    6. using System.Threading.Tasks;
    7. namespace Test
    8. {
    9. class Class1
    10. {
    11. public delegate void ProcessRequestDelegateWithParam(object data);
    12. public void DoAllRequests()
    13. {
    14. DoRequestWithParam(ProcessRequest,100);
    15. DoRequestWithParam(ProcessRequest,2500);
    16. DoRequestWithParam(ProcessRequest,100);
    17. }
    18. public void DoRequestWithParam(ProcessRequestDelegateWithParam processRequest,int iMilliseconds)
    19. {
    20. bool requestWasSuccesful = false;
    21. bool requestTimeout = false;
    22. int numberOfTryings = 0;
    23. int maxNumberOfTryings = 5;
    24. int iMillisecondsToTimeOut = 2000;
    25. do
    26. {
    27. Thread workerThread = new Thread(new ParameterizedThreadStart(processRequest));
    28. workerThread.Start(iMilliseconds);
    29. System.Threading.Thread.Sleep(iMillisecondsToTimeOut);
    30. if (workerThread.IsAlive)
    31. {
    32. Console.WriteLine("Timed out trying again");
    33. numberOfTryings++;
    34. if (numberOfTryings == maxNumberOfTryings)
    35. {
    36. requestTimeout = true;
    37. Console.WriteLine(String.Format("-> Max Tryings reached: {0}", numberOfTryings));
    38. }
    39. }
    40. else
    41. {
    42. requestWasSuccesful = true;
    43. Console.WriteLine(String.Format("-> Single Request success: {0}", requestWasSuccesful));
    44. }
    45. }
    46. while (!requestWasSuccesful && !requestTimeout);
    47. Console.WriteLine(String.Format("-> Overall Success: {0}", requestWasSuccesful));
    48. }
    49. private void ProcessRequest(object str)
    50. {
    51. int intStr; bool intResultTryParse = int.TryParse(str.ToString(), out intStr);
    52. if (intResultTryParse == true)
    53. {
    54. System.Threading.Thread.Sleep(intStr);
    55. }
    56. }
    57. }
    58. }

    Quellcode

    1. -> Single Request success: True
    2. -> Overall Success: True
    3. Timed out trying again
    4. Timed out trying again
    5. Timed out trying again
    6. Timed out trying again
    7. Timed out trying again
    8. -> Max Tryings reached: 5
    9. -> Overall Success: False
    10. -> Single Request success: True
    11. -> Overall Success: True


    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.Linq
    4. Imports System.Text
    5. Imports System.Threading
    6. Imports System.Threading.Tasks
    7. Namespace Test
    8. Class Class1
    9. Public Delegate Sub ProcessRequestDelegate(ByVal data As Object)
    10. Public Sub DoAllRequests()
    11. DoRequestWithParam(ProcessRequest(100))
    12. DoRequestWithParam(ProcessRequest(2500))
    13. DoRequestWithParam(ProcessRequest(100))
    14. End Sub
    15. Public Sub DoRequestWithParam(processRequest As [Delegate])
    16. Dim requestWasSuccesful As Boolean = False
    17. Dim requestTimeout As Boolean = False
    18. Dim numberOfTryings As Integer = 0
    19. Dim maxNumberOfTryings As Integer = 5
    20. Dim iMillisecondsToTimeOut As Integer = 2000
    21. Do
    22. Dim workerThread As Thread = New Thread(New ParameterizedThreadStart(Function() processRequest))
    23. workerThread.Start()
    24. System.Threading.Thread.Sleep(iMillisecondsToTimeOut)
    25. If workerThread.IsAlive Then
    26. Console.WriteLine("Timed out trying again")
    27. numberOfTryings = numberOfTryings + 1
    28. If (numberOfTryings = maxNumberOfTryings) Then
    29. requestTimeout = True
    30. Console.WriteLine(String.Format("-> Max Tryings reached: {0}", numberOfTryings))
    31. End If
    32. Else requestWasSuccesful = True
    33. Console.WriteLine(String.Format("-> Single Request success: {0}", requestWasSuccesful))
    34. End If
    35. Loop Until requestWasSuccesful Or requestTimeout
    36. Console.WriteLine(String.Format("-> Overall Success: {0}", requestWasSuccesful))
    37. End Sub
    38. Private Function ProcessRequest(ByVal str As Object)
    39. Dim intStr As Integer
    40. Dim intResultTryParse As Boolean = Integer.TryParse(str.ToString(), intStr)
    41. Console.WriteLine(String.Format("-> Process Request time: {0}", intStr))
    42. System.Threading.Thread.Sleep(intStr)
    43. End Function
    44. End Class
    45. End Namespace

    Quellcode

    1. -> Process Request time: 100
    2. -> Single Request success: True
    3. -> Overall Success: True
    4. -> Process Request time: 2500
    5. -> Single Request success: True
    6. -> Overall Success: True
    7. -> Process Request time: 100
    8. -> Single Request success: True
    9. -> Overall Success: True


    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