2016-11-25 1 views
0

Ich habe die folgenden zwei FunktionenWie kann die Code-Leistung erhöht werden? Multithread oder Aufgaben in C#?

void ParserData(List<DataObject> MyObjcets){ 

     //loop over MyObjects 

     List<ResultObject> Results = new List<ResultObject>(); 
     foreach(var Obj in MyObjects){ 
     //do some computation and add it to an instance of ResultObject 
     ResultObject R = new ResultObject(); 

     Results.Add(R); 
     if(Results.count >= 2000){ 
      //call a function that will insert Results to MYSQL DB 
      InsertDATA(Results); 
      //create empty Results list 
      Results = new List<ResultObject>(); 
     } 
     // 
     } 

Funktion einfügen

void InsertDATA(List<ResultObject> Results){ 
foreach(var R in Results){ 
     ..... 
    //Insert Object to MYSQLDB 
    } 
} 

Ich dachte, diesen Code schneller zu machen, aber ich bin nicht sicher, dass der beste Weg zu gehen. Der Grund, warum ich alle 2000 einfüge, liegt daran, dass das System danach keinen Speicher mehr hat. gibt es einen Weg, dass, nachdem ich die Daten, die eingefügt werden sollen, senden kann ich mehr Berechnungen ausführen, während die Daten, die ich gesendet habe, eingefügt werden, und nicht warten, bis die Einfügung abgeschlossen ist?

Alle Vorschläge, um diesen Code schneller zu machen, werden geschätzt.

+3

Der beste Vorschlag ist, verwenden Sie einen Profiler auf Ihrem Programm und sehen, was es tatsächlich verbringen es ist Zeit. –

+0

Check-out 'dotTrace' https://www.jetbrains.com/profiler/ Es gibt eine kostenlose 30-Tage-Testversion –

+0

Wenn es das triviale und die Daten in der gleichen Tabelle ist, könnten Sie besser offff verwenden Batch-Einsätze – ferdyh

Antwort

4

Basierend auf den von Ihnen bereitgestellten Informationen können Sie async/await Ansatz für die Datenbankmethode verwenden.

Machen Sie Ihre Datenbank Einfügemethode asynchrone

Task SaveResultAsync(ResultObject result) 
{ 
    var query = "INSERT ...." 
    using (var conn = new MySqlConnection(connectionString)) 
    using (var command = new MySqlCommand(conn, query) 
    { 
     // command.AddParameter for values you want to insert 
     await conn.OpenAsync(); 
     await command.ExecuteNonQueryAsync(); 
    } 
} 

Dann Sie jede Abfrage durch seine eigene, ohne abzuwarten, andere Abfragen und Ergebnisse

async Task ParserData(List<DataObject> MyObjcets) 
{ 
    var tasks = new List<Task>(); 
    foreach(var Obj in MyObjects) 
    { 
     //do some computation and add it to an instance of ResultObject 
     ResultObject result = new ResultObject(); 
     var task = SaveResultAsync(result); 

     tasks.Add(task); 
    } 

    await Task.WhenAll(tasks.ToArray()); 
} 

Natürlich laufen können Sie Signatur von ParseData zu ändern brauchen Methode auch asynchron.
Nach dem Ändern der Signatur, async/await beginnt über Ihre Anwendung verteilt als Zombies :)

+0

I werde das versuchen, vielen Dank. Eine Sache durch, ich gebe nichts von SaveResult zurück, aber der Compiler beklagt sich über Return-Anweisung. brauche ich eine return-Anweisung in der SaveResult-Funktion? – BigFish

+0

Asynchrone Methode gibt immer 'Task' zurück. Wenn die Methode einen Wert zurückgibt, wird sie 'Task ' sein, wenn die Methode 'void' ist (Ihr Fall), wird 'Task' zurückgegeben. Die Idee ist, dass asynchrone Methoden ein Objekt zurückgeben, das Informationen über den Status der Aufgabe enthält. – Fabio

+0

Noch nicht sicher, wie Sie eine Aufgabe zurückgeben. Was soll ich am Ende der Speicherfunktion schreiben? – BigFish

Verwandte Themen