0

私の無知を許してください、しかし私は非同期プログラミングに不慣れで、これを理解することができないようです。

多くの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レコードが確実に設定されるように設定するためのより良い方法はありますか?

4

2 に答える 2

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

于 2013-03-15T00:47:18.800 に答える
1

setSettingが値を返さず、代わりにvoidである場合

setSettingが返された場合、操作がいつ完了しvoidたかを知る方法はありません。メソッドは決して返さasyncれません(イベントハンドラーでない限り)。asyncvoid

メソッドから値を返したくない場合はasync、メソッドの戻り値を。にしTaskます。そうすれば、次に戻る前awaitに、返されたタスクsetSettingが完了していることを確認できます。

于 2013-03-15T01:20:18.523 に答える