对于 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 分钟的时间来处理,如果有多个调用进入,则需要更长的时间。
一些流行的选项是:
在单独的线程上调用 ProcessFile()
-- 或--
重构您的解决方案以包含 3 个部分:
a) 创建工作队列 (db) 以跟踪已上传并需要处理的文件。
b) 不是调用 ProcessFile()
,而是创建一个函数 "enqueue" 将新文件放入工作队列。
c) 创建一个独立的(或预定的)进程来定期检查队列并处理队列中的任何文件。
第二个选项需要更多工作,但它是一种更好、更可靠的模式。它还为您提供更多选择。
我有一个将文件上传到服务器的 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 分钟的时间来处理,如果有多个调用进入,则需要更长的时间。
一些流行的选项是:
在单独的线程上调用
ProcessFile()
-- 或--
重构您的解决方案以包含 3 个部分:
a) 创建工作队列 (db) 以跟踪已上传并需要处理的文件。
b) 不是调用
ProcessFile()
,而是创建一个函数 "enqueue" 将新文件放入工作队列。c) 创建一个独立的(或预定的)进程来定期检查队列并处理队列中的任何文件。
第二个选项需要更多工作,但它是一种更好、更可靠的模式。它还为您提供更多选择。