Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确使用时的任务_C#_Asp.net_Multithreading_Entity Framework_Asynchronous - Fatal编程技术网

C# 正确使用时的任务

C# 正确使用时的任务,c#,asp.net,multithreading,entity-framework,asynchronous,C#,Asp.net,Multithreading,Entity Framework,Asynchronous,我想使用EF async更新几个数据库实体。我有 [HttpPost] public ActionResult Update(StudentViewModel[] studentData) { try { IEnumerable<Task> tasksQuery = studentData.Select(async s => await UpdateStudentData(s));

我想使用EF async更新几个数据库实体。我有

[HttpPost]
    public ActionResult Update(StudentViewModel[] studentData)
    {
        try
        {
            IEnumerable<Task> tasksQuery = studentData.Select(async s => await UpdateStudentData(s));

            List<Task> tasks = tasksQuery.ToList();

            Task.WhenAll(tasks);

            return Json(new { success = true });
        }
        catch (EntityCommandExecutionException ex)
        {
            log.Warn(string.Format("{0}: {1}", "Operation Failed", ex.ToString()));
            return Json(new { success = false });
        }
    }

    private async Task UpdateStudentData(StudentViewModel sm)
    {
        var student= db.Students.FindAsync(sm.Id);
        if (student.Result != null)
        {
            student.Result.SectionId = sm.SectionId;
            student.Result.PreferenceOrder = sm.PreferenceOrder ;
            db.Entry(student.Result).State = EntityState.Modified;
            await db.SaveChangesAsync();
        }
    }
[HttpPost]
公共操作结果更新(StudentViewModel[]studentData)
{
尝试
{
IEnumerable tasksQuery=studentData.Select(async s=>await UpdateStudentData);
List tasks=tasksQuery.ToList();
任务。WhenAll(任务);
返回Json(新的{success=true});
}
捕获(EntityCommandExecutionException ex)
{
log.Warn(string.Format(“{0}:{1}”,“操作失败”,例如ToString());
返回Json(新的{success=false});
}
}
专用异步任务UpdateStudentData(StudentViewModel sm)
{
var student=db.Students.FindAsync(sm.Id);
如果(student.Result!=null)
{
student.Result.SectionId=sm.SectionId;
student.Result.PreferenceOrder=sm.PreferenceOrder;
db.Entry(student.Result).State=EntityState.Modified;
等待db.saveChangesSync();
}
}

只需要一次手术。我做错了什么?我想更新所有实体,而不是按顺序更新。

忽略此项并查看更新

[HttpPost]
    public async Task<ActionResult> Update(StudentViewModel[] studentData) //notice async in this line
    {
        try
        {
            IEnumerable<Task> tasksQuery = studentData.Select(async s => await UpdateStudentData(s));

            List<Task> tasks = tasksQuery.ToList();

            await Task.WhenAll(tasks); //Notice await here

            return Json(new { success = true });
        }
        catch (EntityCommandExecutionException ex)
        {
            log.Warn(string.Format("{0}: {1}", "Operation Failed", ex.ToString()));
            return Json(new { success = false });
        }
    }

    private async Task UpdateStudentData(StudentViewModel sm)
    {
        var student= db.Students.FindAsync(sm.Id);
        if (student.Result != null)
        {
            student.Result.SectionId = sm.SectionId;
            student.Result.PreferenceOrder = sm.PreferenceOrder ;
            db.Entry(student.Result).State = EntityState.Modified;
            await db.SaveChangesAsync();
        }
    }

我想我的问题出在“var student=db.Students.FindAsync(sm.Id);”上。它只输入(student.Result!=null)一次,但如果一次按顺序运行一次,每次都会命中。您的答案是正确的,但是,我发现DbContext不是线程安全的。这就是为什么我被执行了可疑的死刑。
[HttpGet]
public async Task<JsonResult> Update() //notice async in this line and I have changed the return type
{
    try
    {
        var id = 0;
        //Create random data
        StudentViewModel[] studentData = new StudentViewModel[] {
        new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ },
        new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ },
        new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ }, new StudentViewModel { ID = id++ }
        };
        IEnumerable<Task> tasksQuery = studentData.Select(s => UpdateStudentData(s)); //Note there is no async and await in this line

        List<Task> tasks = tasksQuery.ToList();

        await Task.WhenAll(tasks); //Note await here

        return Json(new { success = true });
    }
    catch (Exception ex)
    {
        //log.Warn(string.Format("{0}: {1}", "Operation Failed", ex.ToString()));
        return Json(new { success = false });
    }
}

private async Task UpdateStudentData(StudentViewModel sm)
{
    await Task.Run(() =>
    {
        var sleepDelay = new Random().Next(500, 1000);
        Task.Delay(sleepDelay); //Add random sleep to prove that students are not processsesd in a sequence
        Debug.WriteLine($"ID: {sm.ID}, SleepDelay: {sleepDelay}");
    });         
}

public class StudentViewModel
{
    public int ID { get; internal set; }
}
ID: 0, SleepDelay: 868
ID: 1, SleepDelay: 868
ID: 3, SleepDelay: 787
ID: 4, SleepDelay: 966
ID: 2, SleepDelay: 868
ID: 6, SleepDelay: 743
ID: 7, SleepDelay: 661
ID: 8, SleepDelay: 520
ID: 9, SleepDelay: 520
ID: 10, SleepDelay: 520
ID: 11, SleepDelay: 520
ID: 5, SleepDelay: 564