异步SQLite计时的问题
请原谅我的无知,但我对异步编程是新手,我似乎无法理解这一点 我有一个Windows Phone 8应用程序,其中包含许多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
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);