c# - whenall - Asincrónico y espera la confusión
task.run async c# (1)
hola amigo tengo confusión en el trabajo de asincrónica y espero palabras clave. En realidad, he escrito esta función asíncrona
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);
}
}
la parte interna es simplemente innecesaria ... aquí he llamado a esta función en un clic de botón sin esperar la palabra clave ...
private void GrdReport_Tapped_1(object sender, TappedRoutedEventArgs e)
{
FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);
}
este método se ejecutará de forma asíncrona, pero está bien, pero en algún otro lugar donde deseo utilizar los datos llenados con este método ... quería asegurarme de que llenara todos los datos antes de hacer cualquier cálculo ... así que pensé simplemente en ponerlo a la espera antes de que sea así ...
await FillAssignmentStudentTableFromExtraUsers(3,listofjtoken);
pero estoy pensando que la declaración anterior lo hará funcionar nuevamente, ya sea que espere la llamada anterior ... cualquier sugerencia sobre cómo esperar a que se complete la primera llamada ... o mi suposición es incorrecta ... se agradece cualquier ayuda ...
Una manera fácil de detectar si la tarea ya se ha ejecutado es guardar la tarea como un campo privado y esperarla siempre que necesite verificar su estado.
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
}
}
Para cuando llame a await _task
, await _task
una de las siguientes dos cosas:
- si la tarea aún se está ejecutando, esperará (asíncronamente, por supuesto) para que finalice.
- si la tarea se ha completado, tu método continuará