我有一个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分钟的处理时间,如果有多个调用进入,则可能需要更长的时间。
答案 0 :(得分:0)
一些受欢迎的选择是:
在单独的线程上调用ProcessFile()
-或-
将您的解决方案重构为包含三个部分:
a)创建一个工作队列(db),以跟踪已上传并需要处理的文件。
b)而不是调用ProcessFile()
,而是使用一个函数将新文件“排队”到工作队列中。
c)创建一个独立的(或计划的)进程,以定期检查队列并处理队列中的任何文件。
第二个选项工作量更多,但它是一种更好且更可靠的模式。它还为您提供了更多的选择。