2017-03-05 1 views
0

ich folgenden Funktionalität mit diesem CodeWie Warten Sie, bis alle Elemente in einer Liste mit Async Await verarbeitet - C#

1. Ich habe Liste der Elemente zu erreichen versuchen, und ich will Prozesselemente parallel Weg zu beschleunige den Prozess.

2. auch ich will warten, bis alle Daten in der Liste verarbeitet erhalten und gleiche Sache muß ich in der Datenbank aktualisieren

private async Task<bool> ProceeData<T>(IList<T> items,int typeId,Func<T, bool> updateRequestCheckPredicate, Func<T, bool> newRequestCheckPredicate) 
    { 
      continueFlag = (scripts.Count > =12) ? true : false; 
      await ProcessItems(items, updateRequestCheckPredicate, newRequestCheckPredicate); 

      //Wait Until all items get processed and Update Status in database 

      var updateStatus =UpdateStatus(typeId,DateTime.Now); 
      return continueFlag; 
    } 

    private async Task ProcessItems<T>(IList<T> items,Func<T, bool> updateRequestCheckPredicate, Func<T, bool> newRequestCheckPredicate) 
    { 
     var itemsToCreate = items.Where(newRequestCheckPredicate).ToList(); 

     var createTask = scripts 
        .AsParallel().Select(item => CrateItem(item); 
        .ToArray(); 
     var createTaskComplete = await Task.WhenAll(createTask); 

     var itemsToUpdate = items.Where(updateRequestCheckPredicate).ToList(); 

     var updateTask = scripts 
        .AsParallel().Select(item => UpdateItem(item) 
        .ToArray(); 

     var updateTaskComplete = await Task.WhenAll(updateTask); 
    } 

    private async Task<ResponseResult> CrateItem<T>(T item) 
    { 
     var response = new ResponseResult(); 
     Guid requestGuid = Guid.NewGuid(); 
     auditSave = SaveAuditData(requestGuid); 
     if (auditSaveInfo.IsUpdate) 
     { 
      response = await UpdateItem(item); 
     } 
     response = await CreateTicket<T>(item); 
     // Wait response 
     UpdateAuditData(response) 
    } 
    private async Task<ServiceNowResponseResult> CreateTicket<T>(T item) 
    { 
     // Rest call and need to wait for result 
     var response = await CreateNewTicket<T>(scriptObj, serviceRequestInfo); 
     return response; 
    } 

Ich bin Asynchron-Konzept zu erwarten und so jemand pls Beratung ich, ob ich tue, ist ein richtiger Ansatz oder wenn falsch, bitte helfen Sie mir mit Hilfe eines Beispielcodes

Antwort

1

All diese AsParallel sind nicht erforderlich oder gewünscht, aber Sie müssten die Signatur Ihrer Rückrufe async ändern.

Hier ist ein Beispiel

async Task ProcessAllItems<T>(IEnumerable<T> items, 
     Func<T, Task<bool>> checkItem, // an async callback 
     Func<T, Task> processItem) 
    { 
// if you want to group all the checkItem before any processItem is called 
// then do WhenAll(items.Select(checkItem).ToList()) and inspect the result 
// the code below executes all checkItem->processItem chains independently 
     List<Task> checkTasks = items 
      .Select(i => checkItem(i) 
      .ContinueWith(_ => 
      { 
       if (_.Result) 
        return processItem(i); 
       return null; 
      }).Unwrap()) // .Unwrap takes the inner task of a Task<Task<>> 
      .ToList();  // when making collections of tasks ALWAYS materialize with ToList or ToArray to avoid accudental multiple executions 

     await Task.WhenAll(checkTasks); 

    } 

Und hier ist, wie es zu benutzen:

var items = Enumerable.Range(0, 10).ToList(); 
var process = ProcessAllItems(items, 
    checkItem: async (x) => 
    { 
     await Task.Delay(5); 
     return x % 2 == 0; 
    }, 
    processItem: async (x) => 
    { 
     await Task.Delay(1); 
     Console.WriteLine(x); 
    }); 
+0

Ich bin etwas verwirrt mit ur Probe code.Which sind diese Methoden CheckItem, ProcessItem. Kann es mit den Funktionen zuordnen, die ich in der ursprünglichen Frage – vmb

+0

verwendet habe Es wird sehr hilfreich sein, wenn Sie den Code mit denselben Methodennamen und Variablennamen schreiben, die ich in der ursprünglichen Frage – vmb

+0

Verarbeitung von ItemsToUpdate Sammlung sollte erst nach Abschluss beginnen Verarbeitung der createTask-Sammlung – vmb