我现在的情况很难解释,所以我会写一个更简单的版本来解释这个问题。
我有Observable.from()
,它会发出由ArrayList
个文件定义的文件序列。所有这些文件都应该上传到服务器。为此,我有一个功能来完成工作并返回Observable
。
Observable<Response> uploadFile(File file);
当我运行此代码时,它会变得疯狂,Observable.from()
会发出所有文件并将它们全部上传到文件中,或者至少可以处理它可以处理的最多线程。
我希望最多同时上传2个文件。是否有任何操作员可以为我处理这个问题?
我尝试了缓冲区,窗口和其他一些,但它们似乎只会一起发出两个项目,而不是经常上传两个并行文件。我还尝试在上传部分设置最大线程池,但在我的情况下不能使用它。
这个权利应该有一个简单的运算符吗?我错过了什么吗?
答案 0 :(得分:7)
我认为所有文件都是并行上传的,因为您正在使用Sub Button27_Click()
Dim wbThis As Workbook, wbThat As Workbook
Dim ws As Worksheet
Dim fName As String
On Error GoTo Whoa
Set wbThis = ThisWorkbook
Set ws = wbThis.Sheets("Sheet3")
fName = wbThis.Path & "\sefaresh.xlsm"
Application.ScreenUpdating = False
Set wbThat = Workbooks.Open(fName)
DoEvents
ws.Copy After:=wbThat.Sheets(wbThat.Sheets.Count)
'~~> close and save the workbook
wbThat.Close (True)
DoEvents '<~~ Give time for it to save and close
LetsContinue:
Application.ScreenUpdating = True
MsgBox "Done"
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
,它会同时执行所有转换。相反,你应该使用flatMap()
,它运行一个接一个的转换。要运行两个并行上传,您需要在可观察文件上调用concatMap()
,然后像在代码中一样调用window(2)
。
flatMap()
<强>更新强>:
我找到了一个更好的解决方案,它可以完全满足您的需求。 Observable<Response> responses =
files
.window(2)
.concatMap(windowFiles ->
windowFiles.flatMap(file -> uploadFile(file));
);
的重载接受最大并发线程数。
flatMap()