WCF — обработка потоков на сервере для более быстрого выпуска клиенту

#vb.net #wcf

#vb.net #wcf

Вопрос:

Когда функция вызывается на сервер, файл загружается и сохраняется в папке. Затем файл должен быть обработан, что занимает некоторое время и может привести к тайм-ауту клиента.

Чтобы обойти это, я подумал, что, поместив обработку файла в отдельный поток, чтобы подпрограмма могла вернуться к клиенту после загрузки файла. И обработка файла будет продолжаться в фоновом режиме.

К сожалению, поток останавливает возврат. Я не понимаю, с чем у меня проблема. Я думал, что с помощью потока это позволит подпрограмме завершить и вернуться к клиенту.

 Public Sub RestoreToOps(rFileInfo As RemoteFileInfo) Implements IRestore.RestoreToOps
    Dim oLogItem As New LogItem
    Dim sDestinationFolder As String = My.Settings.DestinationFolder
    Try
        Dim sFileDestination As String = Path.Combine(sDestinationFolder, rFileInfo.FileName)
        If File.Exists(sFileDestination) Then
            File.Delete(sFileDestination)
        End If
        Using fs As FileStream = New FileStream(sFileDestination, FileMode.Create, FileAccess.Write, FileShare.Read)
            fs.Write(rFileInfo.FileBytes, 0, rFileInfo.FileBytes.Length)
        End Using
        ProcessFile(rFileInfo.FileName)
    Catch ex As Exception
        'Error Handling
    End Try
End Sub

'*************************************************************************

Private Function ProcessFile(ByVal FileName As String) As Boolean
    Dim oThread As Thread = Nothing
    Dim oObject As Object = Nothing
    Dim oLogItem As New LogItem
    Dim sDBName As String = ""
    Dim bSuccess As Boolean = False
    Try
        If InStr(FileName, "Move.zip") > 0 Then
            sDBName = Replace(FileName, "Move.zip", "")
            oThread = New Thread(New ParameterizedThreadStart(AddressOf MakeRestoreFromObject))
            oThread.IsBackground = True
            oThread.Start(sDBName)
            oThread.Join()
        End If
    Catch ex As Exception
        'Error Handling
    End Try
    Return bSuccess
End Function
  

Функция «MakeRestoreFromObject» занимает значительное количество времени, и при использовании приведенной выше кодировки подпрограмма ожидает завершения функции перед возвратом…..

Ответ №1:

oThread.Join() вызывает блокировку вашего основного потока до oThread завершения. Просто удалите эту строку кода.