对于 WCF - 如何在仍在处理的同时向客户端 return

For WCF - How to return to the client while still processing

我有一个将文件上传到服务器的 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

        End Try
    End Sub

<MessageContract>
Public Class RemoteFileInfo
    <MessageHeader>
    Public FileName As String

    <MessageBodyMember(Order:=1)>
    Public FileBytes() As Byte

End Class

客户端必须等待 ProcessFile() 函数完成才能返回给客户端。这是无法接受的! ProcessFile() 函数可能需要长达 2 分钟的时间来处理,如果有多个调用进入,则需要更长的时间。

一些流行的选项是:

  1. 在单独的线程上调用 ProcessFile()

    -- 或--

  2. 重构您的解决方案以包含 3 个部分:

    a) 创建工作队列 (db) 以跟踪已上传并需要处理的文件。

    b) 不是调用 ProcessFile(),而是创建一个函数 "enqueue" 将新文件放入工作队列。

    c) 创建一个独立的(或预定的)进程来定期检查队列并处理队列中的任何文件。

第二个选项需要更多工作,但它是一种更好、更可靠的模式。它还为您提供更多选择。