私の無知を許してください、しかし私は非同期プログラミングに不慣れで、これを理解することができないようです。
多くのSQLite操作を備えたWindowsPhone8アプリケーションがあります。
データベースに値が設定されることがありますが、取得に間に合わないようです。しかし、これは一貫して発生するわけではないため、スレッドの問題かどうか疑問に思っています。
次のようなレコードを挿入する方法があります。
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は設定された値を返しません。
さらに、アプリケーションの一部で、ユーザーはいくつかの情報を入力するように求められます。この情報はデータベースに設定され、すぐにxmlWebサービスで使用されます。上記のコードとまったく同じように見えますが、これは時間内に設定されているようには見えません。
これはこれを行う正しい方法ですか?UIスレッドをロックせずに、SQLiteレコードが確実に設定されるように設定するためのより良い方法はありますか?