异步并等待混乱

时间:2013-09-10 11:41:05

标签: c# .net asynchronous windows-8 async-await

你好朋友我在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>

1 个答案:

答案 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时,会发生以下两件事之一:

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