异步SQLite计时的问题

异步SQLite计时的问题,sqlite,asynchronous,windows-phone-8,Sqlite,Asynchronous,Windows Phone 8,请原谅我的无知,但我对异步编程是新手,我似乎无法理解这一点 我有一个Windows Phone 8应用程序,其中包含许多SQLite操作 我曾经遇到过这样的问题:偶尔会在数据库中设置一个值,但它显然没有在检索时及时设置。但这种情况并不总是发生,这就是为什么我想知道这是否是一个线程问题 我有这样一种插入记录的方法: public async Task<string> getSetting(Settings setting) { string returnStri

请原谅我的无知,但我对异步编程是新手,我似乎无法理解这一点

我有一个Windows Phone 8应用程序,其中包含许多SQLite操作

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

我有这样一种插入记录的方法:

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;
    }
它工作正常,在“检索”的下一行上的控制台打印是正确的值。但是,在许多其他场景中,如果setSetting不返回值,而是无效,则设置似乎没有及时设置,getSetting也不会返回设置的值

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


这是正确的做法吗?有没有更好的方法来设置SQLite记录以确保在不锁定UI线程的情况下进行设置?

您应该使用
wait
而不是
Task。结果

var insert = await Constants.getData().setSetting(ExampleSetting, "userIDtest", false);
string retrieving = await Constants.getData().getSetting(ExampleSetting);
上面的代码将等待db调用完成,但不会阻止UI。请注意,这在控制台应用程序中不起作用-它只在GUI应用程序中起作用

除此之外,您的
getSetting
代码看起来还不错。我无法对设置进行评论,因为您的问题中没有显示设置

如果setSetting未返回值,而是为void

如果
setset
返回
void
,则无法知道
async
操作何时完成。
async
方法不应返回
void
(除非它是事件处理程序)


如果不希望从
异步
方法返回值,请将方法返回值设置为
任务
。这样,您仍然可以
等待返回的任务,以确保
设置设置
在继续之前完成。

您有
设置
代码,上面显示了两次。我想您也想显示
setset
。谢谢您的回复。另外,您的文章“异步编程中的最佳实践”和您的博客文章“不要阻塞异步代码”非常有用!
var insert = Constants.getData().setSetting(ExampleSetting, "userIDtest", false).Result;
string retrieving = Constants.getData().getSetting(ExampleSetting).Result;
var insert = await Constants.getData().setSetting(ExampleSetting, "userIDtest", false);
string retrieving = await Constants.getData().getSetting(ExampleSetting);