异步SQLite计时的问题

时间:2013-03-15 00:42:51

标签: sqlite asynchronous windows-phone-8

原谅我的无知,但我是异步编程的新手,我似乎无法解决这个问题。

我有一个带有许多SQLite操作的Windows Phone 8应用程序。

我一直遇到问题,偶尔会在数据库中设置一个值,但显然没有及时检索它。但这并不是一直发生的,这就是为什么我想知道它是否是一个线程问题。

我有一个插入记录的方法:

public async Task<string> getSetting(Settings setting)
    {
        string returnString = "";
        string setName = setting.getName();


        try
        {
            SQLiteAsyncConnection conn = new SQLiteAsyncConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "newDatabase"), true);
            var query = conn.Table<ClientSettings>().Where(x => x.ID == setName);
            var result = await query.ToListAsync().ConfigureAwait(false);

            foreach (var item in result)
            {

                returnString = item.Value;
            }
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine("\nERROR: " + e);

        }
        return ret;
    }

我还有一种方法可以检索这些:

public async Task<string> getSetting(Settings setting)
    {
        string returnString = "";
        string setName = setting.getName();


        try
        {
            SQLiteAsyncConnection conn = new SQLiteAsyncConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "newDatabase"), true);
            var query = conn.Table<MySettings>().Where(x => x.ID == setName);
            var result = await query.ToListAsync().ConfigureAwait(false);

            foreach (var item in result)
            {
                returnString = item.Value;
            }
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine("\nERROR: " + e);

        }
        return returnString;
    }

如果我在主页面中这样称呼它:

var insert = Constants.getData().setSetting(ExampleSetting, "userIDtest", false).Result;
string retrieving = Constants.getData().getSetting(ExampleSetting).Result;

它工作正常,下一行“检索”的控制台打印是正确的值。但是,在许多其他情况下 - 如果setSetting没有返回值但是为void,则设置似乎没有及时设置,并且getSetting不返回值集。

此外,在部分应用程序中,系统会提示用户输入一些信息,然后将其设置到数据库中并立即在xml Web服务中使用。尽管代码看起来与上面完全一样,但似乎并没有及时设置。

这是正确的做法吗?有没有更好的方法来设置SQLite记录以确保它们被设置,而无需锁定UI线程?

2 个答案:

答案 0 :(得分:1)

您应该使用await代替Task.Result

var insert = await Constants.getData().setSetting(ExampleSetting, "userIDtest", false);
string retrieving = await Constants.getData().getSetting(ExampleSetting);

上面的代码将等待您的db调用完成,但不会阻止UI。请注意,这在控制台应用程序中不起作用 - 它只能用于GUI应用程序。

除此之外,您的getSetting代码看起来还不错。我无法对setSetting发表评论,因为它未在您的问题中显示。

答案 1 :(得分:1)

  

如果setSetting没有返回值,而是为void

如果setSetting返回void,则您无法知道async操作何时完成。一个async方法永远不会返回void(除非它是一个事件处理程序)。

如果您不想从async方法返回值,请将方法返回值设为Task。这样,您仍然可以await返回的任务,以确保setSetting完成后再继续。