2

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

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

但我认为上述语句使其再次运行是否等待上一次通话..任何建议如何等待第一次通话完成..或者我的假设是错误的..任何帮助表示赞赏..

4

1 回答 1

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

  • 如果任务仍在运行,您将等待(当然是异步的)它完成。
  • 如果任务已完成,您的方法将继续进行
于 2013-09-10T12:02:38.660 回答