Похоже, что у вас есть состояние гонки с экземпляром request
, который вы передаете функции Execute
.
// The request instance must be created before this line, and you're passing the same
// instance to each call of Execute.
ListOfLists.Select(ids => Observable.FromAsync(() => Execute(request, ids))).Merge(10);
CreateRequest
не создает новый экземпляр HttpRequestType
, он просто изменяет тот, который передается Execute
. И поскольку каждый поток Execute
работает с одним и тем же экземпляром HttpRequestType
, они просто перезаписывают друг друга.
Итак, может происходить что-то подобное:
Thread A
Запускается и параметр ids
равен [1, 2, 3]
. Thread A
вводит SomeFunction
и звонит func
. Параметр toList
, полученный для Thread A
, равен [1, 2, 3]
, поэтому request.SomeProperty
устанавливается на [1, 2, 3]
, затем HttpRequest
создается с [1, 2, 3]
в заголовке где-то и возвращается к SomeFunction
. DoSomethingWithRequestFails
для Thread A
.
В то же время, Thread B
запущен. Параметр ids
равен [4, 5, 6]
. Thread B
вводит SomeFunction
и звонит func
. Thread B
устанавливает request.SomeProperty
на [4, 5, 6]
, затем вызывает ConvertToHttpRequestMessage
.
Теперь, прежде чем Thread B
сможет создать HttpRequest
, Thread A
(который не удался), входит в блок finally
в SomeFunction
и снова вызывает func
. Thread A
устанавливает request.SomeProperty
обратно на [1, 2, 3]
, и поскольку Thread A
и Thread B
оба мутируют в одном и том же экземпляре HttpRequestType
, Thread B
теперь имеет [1, 2, 3]
в request.SomeProperty
.
И Thread A
, и Thread B
создают HttpRequest
с [1, 2, 3]
в заголовке. Список идентификаторов [1, 2, 3]
дублируется, а список [4, 5, 6]
никогда не отправляется.
Попробуйте передать toList
из CreateRequest
в ConvertToHttpRequestMessage
вместо просто HttpRequestType
или создать новый экземпляр HttpRequestType
для каждого вызова Execute
.