【发布时间】:2014-12-17 15:31:45
【问题描述】:
我目前正在尝试编写异步代码,我感觉我的代码一点也不正确。
我有以下方法:
public void Commit()
{
_context.SaveChangesToDatabase();
}
不要在这里判断代码,因为这只是示例。另外,不要说如果我使用的是实体框架,它们已经与异步方法打包在一起。我只是想了解这里的异步概念。
假设SaveChangesToDatabase 方法确实需要几秒钟才能完成。
现在,我不想等待它,所以我创建了一个异步方法:
public async Task CommitAsync()
{
await Task.Run(() => Commit());
}
这是否意味着如果我有方法:
public void Method()
{
// Operation One:
CommitAsync();
// Operation Two.
}
这是否意味着我的操作二代码将在CommitAsync() 完成之前执行?
如果没有,请指导我正确的方向。
更新
根据这里的评论,我忽略了我的异步方法结果,这个实现更好吗?
public Task<TaskResult> CommitAsync()
{
var task = new Task<TaskResult>(() =>
{
try { Commit(); }
catch (Exception ex)
{
return new TaskResult
{
Result = TaskExceutionResult.Failed,
Message = ex.Message
};
}
return new TaskResult { Result = TaskExceutionResult.Succeeded };
});
task.Start();
return task;
}
这确实意味着我需要将async 修饰符放在调用此代码的方法上,以便我可以等待它,这意味着继续当前执行并在此方法完成时返回。
【问题讨论】:
-
我能理解这个问题,但您可以在几乎任何环境中轻松地自行测试,您是否尝试过自己测试?
-
你通常会发现
async是“传染性的”——一旦你将它应用到一个方法中,你通常会想要在你的调用方法中使用await,然后它必须变成async他们自己,一直到顶端。 -
抱歉,我是异步的新手,所以对于某些人来说这似乎是一个微不足道的问题,但我就是不明白。
-
您可以自己使用play。正如@Damien_The_Unbeliever 已经提到的,要拥有你想要的
await并拥有await,你需要Method()一直是async:) -
我可以推荐阅读 Stephen Taub 在 MSDN 上的博客文章:blogs.msdn.com/b/pfxteam
标签: c# asynchronous async-await c#-5.0