原谅我的无知,但我是异步编程的新手,我似乎无法解决这个问题。
我有一个带有许多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线程?
答案 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
完成后再继续。