当我使用Task.Run()调用方法时,它必须是异步方法吗?

时间:2018-12-31 07:48:45

标签: c# xamarin xamarin.forms async-await task

我的代码如下:

    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);

然后我要更新数据库,然后要延迟250ms。

但是我的IncrementPoints方法不是异步方法可以吗?

1 个答案:

答案 0 :(得分:3)

我不确定您要做什么,但可以回答您的问题:

  

但是我的IncrementPoints方法不是异步方法可以吗?

是的,没关系,这也正是Task.Run的目的之一。您可以使用Task.Run将同步操作转换为等待的异步操作。因此,您应该将非异步方法放入lambda中。如果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);