在同步函数中保存对db async的更改

时间:2014-03-31 09:18:17

标签: c# entity-framework asynchronous task-parallel-library dbcontext

我想在同步函数中使用saveChangesAsync。我想要使​​用它的情况就是例如。

public string getName(int id)
{
 var db =  new dbContext();
 String name= db.names.find(id);
 db.log.add(new Log("accessed name");
 db.savechangesAsync();
 return name;
}

所以基本上我不在乎日志实际保存到数据库时,我只是不想让它减慢我的getName函数。我希望getname返回,然后可以在/之后的任何时间将日志保存到数据库。

我将如何实现这一目标?没有任何东西取决于提交日志的时间,所以我可能需要2分钟才能完成。

我想出了另一个解决方案:

    private async void UpdateLastComms(string _id)
    {
        int id = Int32.Parse(_id);
        using (var db = new dbContext())
        {
            db.Devices.Where(x => x.UserId == id).FirstOrDefault().LastComms = DateTime.Now;
            await db.SaveChangesAsync();
        }
    }

然后我可以像UpdateLastComms("5");

那样调用此函数

这与第一个相比如何?它会像我想的那样执行吗?

1 个答案:

答案 0 :(得分:4)

像这样的“fire and forget”方法的问题是错误处理。如果将日志保存到数据库时出错,那么您想知道的是什么吗?

如果您想静默忽略错误,那么您可以忽略返回的任务,如第一个示例中所示。您的第二个示例使用async void,这很危险:如果您的第二个示例存在数据库写入错误,则默认行为是使应用程序崩溃。

如果您想通过采取某些操作来处理错误,请在第二个示例中围绕方法的主体添加try / catch