异步等待混乱 [英] Async and await confusion

查看:75
本文介绍了异步等待混乱的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好朋友,我在使用async和await关键字时感到困惑.实际上我已经编写了这个异步函数

hello friend i got confusion in working of async and await keywords.actually i have written this async function

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

    }

内部部分是不必要的...在这里我在某些按钮单击中调用了此功能 没有等待关键字.

inside part is just unnecessary ...here i have called this function in some button click without await keyword..

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

此方法将异步运行是可以的,但在其他地方我想使用此方法填充的数据..我想确保在执行任何计算之前,它应该填充所有数据..所以我想到了就这样等待.

this method will run asynchronously that is ok but some where else where i want to use data filled by this method ..i wanted to be sure that it should filled all the data before o do any calculation..so i thought of just putting await before it thr like this..

await FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);

但是我认为以上语句使它再次运行,无论是否等待上一个呼叫.任何建议如何等待第一个呼叫完成..或者我的假设是错误的.任何帮助./p>

but i am thinking that the above statement make it run again whether await for the previous call..any suggestion how wait for the first call to be completed..or my assumption is wrong..any help is appreciated..

推荐答案

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

An easy way to detect whether the task has already run is to save the task as a private field, and await it whenever you need to check its status.

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

By the time you call await _task, one of the following two things will happen:

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

这篇关于异步等待混乱的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆