gpt4 book ai didi

c# - 异步和等待混淆

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:56 25 4
gpt4 key购买 nike

你好 friend ,我对异步和等待关键字的工作感到困惑。实际上我已经编写了这个异步函数

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

}

内部部分是不必要的......在这里我在点击一些按钮时调用了这个函数没有 await 关键字..

 private void GrdReport_Tapped_1(object sender, TappedRoutedEventArgs e)
{
FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);
}

此方法将异步运行,这没问题,但在其他一些地方我想使用此方法填充的数据..我想确保它应该在 o 进行任何计算之前填充所有数据..所以我想到了像这样把 await 放在它之前......

await FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);

但我认为上面的语句让它再次运行是否等待上一个调用..任何关于如何等待第一个调用完成的建议..或者我的假设是错误的..任何帮助表示赞赏..

最佳答案

检测任务是否已经运行的一种简单方法是将任务保存为私有(private)字段,并在需要检查其状态时等待它。

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 时,将发生以下两种情况之一:

  • 如果任务仍在运行,您将等待(当然是异步的)它完成。
  • 如果任务已完成,您的方法将继续

关于c# - 异步和等待混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18718033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com