diff --git a/src/ForceToolkitForNET/ForceClient.cs b/src/ForceToolkitForNET/ForceClient.cs index dd7149b1..9b095aff 100644 --- a/src/ForceToolkitForNET/ForceClient.cs +++ b/src/ForceToolkitForNET/ForceClient.cs @@ -208,16 +208,16 @@ public async Task UserInfo(string url) // BULK METHODS - public async Task> RunJobAsync(string objectName, BulkConstants.OperationType operationType, + public async Task> RunJobAsync(string objectName, BulkConstants.OperationType operationType, IEnumerable> recordsLists) { if (recordsLists == null) throw new ArgumentNullException("recordsLists"); var jobInfoResult = await CreateJobAsync(objectName, operationType); - var batchResults = new List(); + var batchResults = new Queue(); foreach (var recordList in recordsLists) { - batchResults.Add(await CreateJobBatchAsync(jobInfoResult, recordList)); + batchResults.Enqueue(await CreateJobBatchAsync(jobInfoResult, recordList)); } await CloseJobAsync(jobInfoResult); return batchResults; @@ -226,37 +226,36 @@ public async Task> RunJobAsync(string objectName, BulkC public async Task> RunJobAndPollAsync(string objectName, BulkConstants.OperationType operationType, IEnumerable> recordsLists) { - const float pollingStart = 1000; - const float pollingIncrease = 2.0f; + Int32 pollingStart = 1000; var batchInfoResults = await RunJobAsync(objectName, operationType, recordsLists); - var currentPoll = pollingStart; var finishedBatchInfoResults = new List(); + + + int processCount = batchInfoResults.Count; while (batchInfoResults.Count > 0) { - var removeList = new List(); - foreach (var batchInfoResult in batchInfoResults) + var batchInfoResult = batchInfoResults.Dequeue(); + var batchInfoResultNew = await PollBatchAsync(batchInfoResult); + if (batchInfoResultNew.State.Equals(BulkConstants.BatchState.Completed.Value()) || + batchInfoResultNew.State.Equals(BulkConstants.BatchState.Failed.Value()) || + batchInfoResultNew.State.Equals(BulkConstants.BatchState.NotProcessed.Value())) { - var batchInfoResultNew = await PollBatchAsync(batchInfoResult); - if (batchInfoResultNew.State.Equals(BulkConstants.BatchState.Completed.Value()) || - batchInfoResultNew.State.Equals(BulkConstants.BatchState.Failed.Value()) || - batchInfoResultNew.State.Equals(BulkConstants.BatchState.NotProcessed.Value())) - { - finishedBatchInfoResults.Add(batchInfoResultNew); - removeList.Add(batchInfoResult); - } - } - foreach (var removeItem in removeList) + finishedBatchInfoResults.Add(batchInfoResultNew); + } else { - batchInfoResults.Remove(removeItem); + batchInfoResults.Enqueue(batchInfoResult); } + processCount--; - await Task.Delay((int)currentPoll); - currentPoll *= pollingIncrease; + if (batchInfoResults.Count > 0 && processCount == 0) + { + processCount = batchInfoResults.Count; + await Task.Delay(pollingStart =+ pollingStart); + } } - var batchResults = new List(); foreach (var batchInfoResultComplete in finishedBatchInfoResults) { @@ -264,7 +263,7 @@ public async Task> RunJobAndPollAsync(string objectName } return batchResults; } - + public async Task CreateJobAsync(string objectName, BulkConstants.OperationType operationType) { if (string.IsNullOrEmpty(objectName)) throw new ArgumentNullException("objectName"); diff --git a/src/ForceToolkitForNET/IForceClient.cs b/src/ForceToolkitForNET/IForceClient.cs index fd411387..f4bf439e 100644 --- a/src/ForceToolkitForNET/IForceClient.cs +++ b/src/ForceToolkitForNET/IForceClient.cs @@ -33,7 +33,7 @@ public interface IForceClient: IDisposable Task UserInfo(string url); // BULK - Task> RunJobAsync(string objectName, BulkConstants.OperationType operationType, IEnumerable> recordsLists); + Task> RunJobAsync(string objectName, BulkConstants.OperationType operationType, IEnumerable> recordsLists); Task> RunJobAndPollAsync(string objectName, BulkConstants.OperationType operationType, IEnumerable> recordsLists); Task CreateJobAsync(string objectName, BulkConstants.OperationType operationType); Task CreateJobBatchAsync(JobInfoResult jobInfo, ISObjectList recordsObject);