2016-11-14 2 views
0

Ich benutze VB.Net 2010. Ich habe eine Funktion, die eine Datenbank auf Anfragen überprüft und einige der Anfragen können einige Minuten dauern. Ich möchte nicht, dass es während der Verarbeitung von Anforderungen in die Warteschlange gestellt wird. Daher möchte ich dynamisch neue Threads erstellen, um jede neue Anforderung auszuführen, sodass sie gleichzeitig ausgeführt werden können. Ich war mir nicht sicher, ob ich Threads, Threadpools, Hintergrundarbeiter oder etwas anderes verwenden sollte. Irgendwelche Vorschläge und Beispielcode wären großartig. Ich kann mit einem einfachen Beispiel arbeiten. Das ist alles was ich bisher habe.Brauchen Sie Hilfe beim dynamischen Erstellen von Threads in VB.Net

Vielen Dank.

Imports System.Threading 
Module Module1 
Private trd As Thread 
Sub Main() 
    'START THREAD 
    trd = New Thread(AddressOf command_loop) 
    trd.IsBackground = True 
    trd.Start() 

    Console.ReadLine() 
End Sub 
Function command_loop() 
     'CREATE EXPORT FILE 
    Try 
     Dim f As FileInfo 
     Dim export As System.IO.StreamWriter 
     Dim arr_comment 

     'DELETE OLD EXPORT FILE 
     If File.Exists(export_path) Then 
      File.Delete(export_path) 
     End If 

     'VERIFY OLD EXPORT FILE WAS DELETED 
     If File.Exists(export_path) Then 
      writeToLog("ERROR: Old export file for " & username & " was not able to be deleted") 
     End If 

     'GET USER FOLDER CRC 
     Dim di As New DirectoryInfo(user_folder) 
     Dim fiArr As FileInfo() = di.GetFiles() 
     export = My.Computer.FileSystem.OpenTextFileWriter(export_path, True) 
     export.WriteLine("filepath, size, esize, date_mod_timestamp, timestamp, remote_filename, filestatus") 

     For Each f In fiArr 
      Try 
       Using zip As ZipFile = ZipFile.Read(user_folder & "\" & f.Name) 
        For Each e As ZipEntry In zip 
         If (zip.Comment IsNot Nothing) AndAlso (zip.Comment <> "") Then 
          arr_comment = Split(zip.Comment, ":") 
         End If 

         If arr_comment.length <> 3 Then 
          'FILE HAS AN INVALID COMMENT, SO DELETE IT. 
          zip.Dispose() 

          Try 
           writeToLog("Invalid zip file comment, deleting file " & user_folder & "\" & f.Name) 
           File.Delete(user_folder & "\" & f.Name) 
           writeToLog("Zip file successfully deleted") 
          Catch exx As Exception 
           writeToLog("Unable to delete invalid zip file") 
           writeToLog(exx.Message) 
          End Try 
          Continue For 
         End If 

         'CORRECT FILE PATH 
         Dim filepath = Replace(e.FileName, "/", "\\") 

         export.WriteLine(Chr(34) & filepath & Chr(34) & "," & e.UncompressedSize & "," & e.CompressedSize & "," & arr_comment(1) & "," & arr_comment(2) & "," & f.Name & "," & arr_comment(0)) 
         Exit For 
        Next 
       End Using 
      Catch ex As IOException 
       Console.WriteLine(ex.Message) 
      Catch ex As ZipException 
       Console.WriteLine(ex.Message) 
       Try 
        writeToLog("Invalid zip file, deleting file " & user_folder & "\" & f.Name) 
        File.Delete(user_folder & "\" & f.Name) 
        writeToLog("Zip file successfully delete") 
       Catch e As Exception 
        writeToLog("Unable to delete invalid zip file") 
        writeToLog(e.Message) 
       End Try 
      End Try 
     Next f 
     export.Close() 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
    End Try 

End Function 
End Module 
+1

Diese Frage ist zu breit. Sie müssen eingrenzen, was Sie tun, und eine bestimmte Frage stellen. Zum Beispiel kann der Code in der Methode "DO SOMETHING" großen Einfluss auf die richtige Lösung haben. – Enigmativity

+0

sollten Sie alle oben genannten + 'Task.Run' verwenden. Aber es hängt wirklich vom Endziel ab –

+0

Hier ist der Code, der in die Threads geladen werden muss. – rerat

Antwort

1

Ich verwende den Thread-Pool für diese Art von Aufgabe. Es ist viel leichter als das Erstellen neuer Threads und der Hintergrund-Worker unterstützt nur einen Thread pro Worker.

Private Class MyArgs 
    'add things for cancellation/storing results in here 
End Class 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim args As New MyArgs() 
    Threading.ThreadPool.QueueUserWorkItem(AddressOf DoThisSingleThing, New MyArgs) 
End Sub 

Private Sub DoThisSingleThing(state As Object) 
    Dim args = CType(state, MyArgs) 

    While Not args.Cancel 

    End While 

    args.Result = ... 

    'If you need to update the UI afterward then invoke onto its thread. 
    Me.BeginInvoke(Sub() OnComplete(args)) 
End Sub 


Private Sub OnComplete(args As MyArgs) 

End Sub 
+0

Das scheint für mich zu funktionieren. Wenn die Funktion beendet ist, beendet sich der Thread selbst oder muss ich ihn beenden? – rerat

+0

Der Thread ist Teil des Threadpools, sodass er in den Pool zurückgeleitet wird, um von der nächsten Arbeit verwendet zu werden. Sie sollten die Threadpool-Threads nicht beenden oder ändern. – FloatingKiwi

Verwandte Themen