c# - 当我使用 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 不是异步方法可以吗?
解决方案
我不确定你想做什么,但回答你的问题:
但是我的方法 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);
推荐阅读
- python - 如何为图形添加键?
- javascript - jQuery 调用 .GET() 两次并获得结果
- c - scanf 未正确读取 int
- python - 按值将多维数组拆分为另一个
- r - 在 ggplot2 中等效于地图的 eqscplot (geom_sf & coord_sf)
- javascript - 如何以正确的方式进行代码拆分?
- python - WeasyPrint HTML到图像转换:如何使图像大小适应内容?
- c - Scanf 更改 C 中的输入
- android - Android - VideoView 不会播放有声视频
- node.js - 将我的快速应用程序路由到另一个文件后,如何访问 URL 参数?