首页 > 解决方案 > 当我使用 Task.Run() 调用方法时,它必须是异步方法吗?

问题描述

我的代码如下所示:

    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 不是异步方法可以吗?

标签: c#xamarinxamarin.formsasync-awaittask

解决方案


我不确定你想做什么,但回答你的问题:

但是我的方法 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);

推荐阅读