Ho fatto in modo che il codice sottostante funzioni e per lo più non blocchi, tranne dove è il codice process.start.
Tuttavia, la mia domanda è, nella mia applicazione winforms è questo il modo migliore per implementare l'uso di async / attendere per impedire il blocco?
Avendo cercato a fondo di arrivare così lontano, non sono molto chiaro su quale modo migliore avrei potuto fare questo codice in questo contesto, tuttavia sarei grato per qualsiasi suggerimento.
Al livello dell'interfaccia utente:
Private Async Sub getcontacts()
Dim t = ImportMUSContactsAsync()
Await t
If t.IsCompleted Then
BuildLookups()
MainForm.HideWait()
End If
End Sub
Al Datalayer:
Private ImportFiles As New List(Of MUSFile) 'Elided full definition
Public Async Function ImportMUSContactsAsync() As Task(Of Boolean)
Await Task.Run(Sub() DeleteExistingCSV())
Await Task.Run(Sub() ConvertTPSToCSV())
Await Task.Run(Sub() ReadCSVFiles())
Return True
End Function
Chiamate routine secondarie
Private Sub ConvertTPSToCSV()
Dim CSVFolder = New DirectoryInfo(CSVPmanPath)
If Not CSVFolder.Exists Then CSVFolder.Create()
For Each f In ImportFiles
If File.Exists(f.TPSFilename) Then
Dim p = New ProcessStartInfo($"{PathToConverter}", $" csv {f.TPSFilename} {f.CSVFilename}")
Process.Start(p).WaitForExit()
End If
Next
End Sub
Private Sub ReadCSVFiles()
For Each f In ImportFiles
If File.Exists(f.CSVFilename) Then ReadSingleCSV(f)
Next
End Sub
Private Sub ReadSingleCSV(f As MUSFile)
Using textReader As New StreamReader(f.CSVFilename)
Using csv As New CsvReader(textReader)
CSVMapToContact(csv, f)
End Using
End Using
End Sub