你好朋友我在async和await keywords的工作中感到困惑。实际上我写了这个异步函数
private static async Task FillAssignmentStudentTableFromExtraUsers(int assignmentId, List<JToken> lstOfExtraUser)
{
await CreatTable.CreatAssignmentStudentTable();
foreach (var item in lstOfExtraUser)
{
assignmentStudentModel obj = new assignmentStudentModel()
{
AssignmentId = assignmentId,
studentId = (int.Parse)(item.SelectToken("id").ToString()),
name = item.SelectToken("name").ToString(),
username = item.SelectToken("username").ToString()
};
await App.conn.InsertAsync(obj);
}
}
内部部分是不必要的...这里我在一些按钮点击中调用了这个功能 没有等待关键字..
private void GrdReport_Tapped_1(object sender, TappedRoutedEventArgs e)
{
FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);
}
这个方法将异步运行,这是正常的,但有些地方我想要使用此方法填充的数据..我想确保它应该在进行任何计算之前填充所有数据。所以我想到的只是在等待它之前等待......
await FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);
但是我认为上面的声明让它再次运行是否等待前一次调用..任何建议如何等待第一次调用完成..或者我的假设是错误的......非常感谢.. < / p>
答案 0 :(得分:1)
检测任务是否已运行的简单方法是将任务保存为私有字段,并在需要检查其状态时等待它。
public class MyClass
{
private Task _task;
private static async Task FillAssignmentStudentTableFromExtraUsers(int assignmentId, List<JToken> lstOfExtraUser)
{
//...
}
private void GrdReport_Tapped_1(object sender, TappedRoutedEventArgs e)
{
//"fire and forget" task
_task = FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);
}
private void WorkWithData()
{
if(_task != null)
await _task;
//do something
}
}
当你致电await _task
时,会发生以下两件事之一: