0

原谅我的无知,但我是异步编程的新手,我似乎无法弄清楚这一点。

我有一个包含许多 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 线程?

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操作何时完成。一个async方法永远不应该返回void(除非它是一个事件处理程序)。

如果您不想从async方法返回值,请将方法返回值设为 a Task。这样,您仍然可以在继续之前await确保返回的任务完成。setSetting

于 2013-03-15T01:20:18.523 回答