我的代码如下:
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方法不是异步方法可以吗?
答案 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);