2017-07-13 24 views
1

Ich bin ziemlich neu in Datenbanken und asynchrone Programmierung. Ich mache eine POS-App, die schließlich Hunderte von Kunden und möglicherweise Tausende von Transaktionen haben wird. Wenn ich eine Kundensuche durchführen oder ein vorheriges Ticket suchen möchte, möchte ich nicht, dass mein Programm auf die Ergebnisse wartet. HierWie mache ich SQlite async in UWP?

ist die Methode, die das Suchergebnis zeigt:

private void searchCritiria_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) 
    { 
     FilteredCustomer.Clear(); 
     if(searchCritiria.Text.Length >= 3) 
     { 
      SQLiteConnection dbConnection = new SQLiteConnection("Customers.db"); 
      string sSQL = null; 

       sSQL = @"SELECT [first],[last],[spouse],[home],[work],[cell] FROM Customers"; 
       ISQLiteStatement dbState = dbConnection.Prepare(sSQL); 

      while (dbState.Step() == SQLiteResult.ROW) 
      { 
       string sFirst = dbState["first"] as string; 
       string sLast = dbState["last"] as string; 
       string sSpouse = dbState["spouse"] as string; 
       string sHome = dbState["home"] as string; 
       string sWork = dbState["work"] as string; 
       string sCell = dbState["cell"] as string; 
       //Load into observable collection 
       if (searchType.SelectedIndex == 0)//name search 
       { 
        if(sFirst.Contains(searchCritiria.Text) || sLast.Contains(searchCritiria.Text) || sSpouse.Contains(searchCritiria.Text)) 
        FilteredCustomer.Add(new Customer {first = sFirst, last = sLast, spouse = sSpouse, home = sHome, work = sWork, cell = sCell}); 
       } 
       else//number search 
       { 
        if(sWork.Contains(searchCritiria.Text)|| sHome.Contains(searchCritiria.Text) || sCell.Contains(searchCritiria.Text)) 
        FilteredCustomer.Add(new Customer { first = sFirst, last = sLast, spouse = sSpouse, home = sHome, work = sWork, cell = sCell }); 
       } 
      } 
     } 
    } 

Während meiner gesamten Programm, das ich Leere Methoden, die auf diese ähnlich strukturiert sind.

Ich bin mir nicht sicher, wie Sie dieses Problem lösen können. Ich habe versucht, etwas zu recherchieren, aber keinen Erfolg. Jeder Rat würde sehr geschätzt werden!

+0

benutzen 'erwarten Task.Run (() => {});' das wird den Code innerhalb async – Krishna

Antwort

1

Nun, es ist einfach. Lassen Sie Ihre Methode Task statt void zurückgeben. Es ist in der Regel eine schlechte Praxis, entweder void-Methoden zu verwenden, so dass dies helfen wird. So Ihre Methode zu konvertieren awaitable zu sein und daher laufen asynchron die Methodensignatur ändern wie folgt:

public Task PerformSQLTasks() 
    { 
     FilteredCustomer.Clear(); 
     if(searchCritiria.Text.Length >= 3) 
     { 
     SQLiteConnection dbConnection = new SQLiteConnection("Customers.db"); 
     string sSQL = null; 

      sSQL = @"SELECT [first],[last],[spouse],[home],[work],[cell] FROM Customers"; 
      ISQLiteStatement dbState = dbConnection.Prepare(sSQL); 

     while (dbState.Step() == SQLiteResult.ROW) 
     { 
      string sFirst = dbState["first"] as string; 
      string sLast = dbState["last"] as string; 
      string sSpouse = dbState["spouse"] as string; 
      string sHome = dbState["home"] as string; 
      string sWork = dbState["work"] as string; 
      string sCell = dbState["cell"] as string; 
      //Load into observable collection 
      if (searchType.SelectedIndex == 0)//name search 
      { 
       if(sFirst.Contains(searchCritiria.Text) || sLast.Contains(searchCritiria.Text) || sSpouse.Contains(searchCritiria.Text)) 
       FilteredCustomer.Add(new Customer {first = sFirst, last = sLast, spouse = sSpouse, home = sHome, work = sWork, cell = sCell}); 
      } 
      else//number search 
      { 
       if(sWork.Contains(searchCritiria.Text)|| sHome.Contains(searchCritiria.Text) || sCell.Contains(searchCritiria.Text)) 
       FilteredCustomer.Add(new Customer { first = sFirst, last = sLast, spouse = sSpouse, home = sHome, work = sWork, cell = sCell }); 
      } 
     } 
    } 
     return Task.CompletedTask; 
} 

Nun, da Sie eine saubere Methode, die einfach eine Aufgabe gibt, können Sie einfach nennen es in einem async Verfahren mit await zB:

private async void searchCritiria_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) 
{ 
    await PerformSQLTasks(); 
} 
+0

Vielen Dank! Ich habe gerade den Code bearbeitet und es kompiliert. Ich musste laufen, also werde ich es testen, wenn ich nach Hause komme. Wenn es funktioniert, werde ich es als die richtige Antwort markieren. Die task.completedTask war der Fehler, den ich vermisste. Danke nochmal –

+0

Kein Problem. Lassen Sie mich wissen, wenn Sie irgendein Problem haben. –

+0

Arbeitete wie ein Charme !! Ich habe 2000 Kunden mit einer for-Schleife hinzugefügt und die Sammlung wie im Handumdrehen bevölkert! –