如何在UWP中进行SQlite异步?

时间:2017-07-13 12:50:44

标签: c# sqlite asynchronous uwp task

我对数据库和异步编程很新。我正在制作一个POS应用程序,最终将有数百个客户,可能还有数千个交易。当我想进行客户搜索或查找上一张票时,我不希望我的程序等待结果。

以下是显示搜索结果的方法:

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

在整个程序中,我的void方法与此类似。

我不确定如何解决这个问题。我尝试做一些研究但没有成功。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

嗯,这很简单。使您的方法返回Task而不是void。使用void方法通常是一种不好的做法,所以这会有所帮助。因此,要将您的方法转换为等待,从而异步运行,请更改方法签名,如下所示:

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

现在你有一个简单的方法只返回一个任务,你可以用async方法用await来调用它,例如:

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