2017-07-13 11 views
1

私はデータベースと非同期プログラミングにはかなり新しいです。私は最終的に何百もの顧客とおそらく何千ものトランザクションを持つPOSアプリケーションを作っています。顧客の検索や前のチケットの検索をしたいときは、プログラムが結果を待っているのを待ちたくない。私はこれと同様に構成され、ボイドのメソッドを持っている私のプログラムを通してUWPでSQlite非同期を作成するには?

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 }); 
       } 
      } 
     } 
    } 

:ここ

は、検索結果を表示する方法です。

この問題を解決する方法がわかりません。私はいくつかの研究をしましたが成功しませんでした。どんなアドバイスも大歓迎です!

+0

async内でコードを実行する 'await Task.Run(()=> {});'を使用してください。 – Krishna

答えて

1

これは簡単です。あなたのメソッドはvoidの代わりにTaskを返します。いずれにしても、voidメソッドを使用することは、一般的には悪い習慣です。今、あなたは、単にタスクを返すきちんとした方法を持っていることを、あなたは、単にawaitasync方法でそれを呼び出すことができます

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; 
} 

:だからawaitableなるので、以下のようにメソッドのシグネチャを変更非同期で実行するためにあなたの方法を変換します例:

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

ありがとうございました!私はちょうどコードを編集し、うまくコンパイルしました。私は走らなければならなかったので、帰宅したらテストします。それが動作すれば私はそれを正解とマークします。 task.completedTaskは、私が見逃していたものです。再度ありがとう –

+0

問題ありません。あなたが何らかの問題に直面したら私に知らせてください。 –

+0

チャームのように働いた!私は2000人の顧客にforループを追加し、コレクションは簡単に作成されました! –

関連する問題