原谅我的无知,但我是异步编程的新手,我似乎无法弄清楚这一点。
我有一个包含许多 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 线程?