Когда я вызываю метод с помощью Task.Run (), это должен быть асинхронный метод? - PullRequest
0 голосов
/ 31 декабря 2018

Мой код выглядит так:

    async public Task Btn(int pts)
    {
        switch (Settings.mode)
        {
            case MO.Assign:
            case MO.Learn:
                break;
            case MO.Quiz:
                await Task.Run(() => App.DB.IncrementPoints(phrase, 1));
                await Task.Delay(250);
                break;
            case MO.Practice:
                Device.BeginInvokeOnMainThread(() =>
                {
                    vm.Points = new String('☆', phrase.Points + pts);
                });
                await Task.Run(() =>
                {
                    App.DB.IncrementPoints(phrase, pts);
                    App.DB.IncrementHistory(HIST.Views);
                });
                await Task.Delay(250);
                break;
        }
        App.selectedPhrases = null;
        timer2Seconds = 2;
    }


    public void IncrementPoints(Phrase phrase, int pts)
    {
        lock (l)
        {
            db2.Execute("UPDATE phrase SET Points = Points + " + pts +
                        " WHERE PhraseId = '" + phrase.PhraseId + "'");
        }
    }

Я немного запутался с Task.Run и жду.Прежде всего, я хочу, чтобы это обновило экран:

vm.Points = new String('☆', phrase.Points + pts);

Затем я хочу, чтобы база данных была обновлена, а затем произошла задержка в 250 мс.

Но нормально ли, что мой метод IncrementPoints не является асинхронным методом?

1 Ответ

0 голосов
/ 31 декабря 2018

Я не совсем уверен, что вы хотите сделать, но чтобы ответить на ваш вопрос:

Но нормально ли, что мой метод IncrementPoints не является асинхронным методом?

Да, все в порядке, и это тоже одна из целей Task.Run.Вы можете использовать Task.Run, чтобы превратить синхронные операции в ожидаемые асинхронные операции.Таким образом, вы должны поместить не асинхронные методы в лямбду.Если бы IncrementPoints был асинхронным, вам бы не понадобился Task.Run, потому что вы можете просто сделать:

await IncrementPoints(...);

Ваш код должен быть примерно таким:

vm.Points = new String('☆', phrase.Points + pts);

await Task.Run(() =>
{
    App.DB.IncrementPoints(phrase, pts);
    App.DB.IncrementHistory(HIST.Views);
});
await Task.Delay(250);
...