我正在构建一个WCF服务,我需要对构建异步方法做一些澄清。
该功能应该是当请求到达时,它包含authorizationToken形式的认证信息,该信息被检查,如果授权通过,则执行实际功能。
首先,Service1.cs包含此方法:
public async Task<string> CreateClass(string name, int departmentId)
{
Class result = null;
bool authResult = await System.Threading.Tasks.Task.Run(() =>
{
return authCtr.AuthenticateToken();
});
if (authResult)
{
result = await System.Threading.Tasks.Task.Run(() =>
{
return classCtr.CreateClass(name, departmentId);
});
}
return result != null ?
JsonConvert.SerializeObject(result, Formatting.Indented) :
string.Format(response.StatusCode + "," + response.StatusDescription);
}
在这个示例中,两个方法AuthenticateToken()和CreateClass()都是同步的,它们负责在各个表上创建和读取数据库操作。 在阅读了更多内容后,我想到将两种方法修改为异步并修改以前的代码,但是在阅读越来越多之后,混淆命中并且我无法确定哪种方式更好/更正。如果我要选择,那么我会将所有方法重写为异步并在服务中将它们称为:
public async Task<string> CreateClass(string name, int departmentId)
{
Class result = null;
if(await authCtr.AuthenticateToken())
{
result = await classCtr.CreateClass(name, departmentId);
}
return result != null ?
JsonConvert.SerializeObject(result, Formatting.Indented) :
string.Format(response.StatusCode + "," + response.StatusDescription);
}
所以问题1:这些方法中的任何一种实际上是异步的,还是只是一团糟?
问题2:如果我要更改控制器方法async,是否只需修改它们就可以这样了:
return await System.Threading.Tasks.Task.Run(() =>
{
//DO DB STUFF
}
答案 0 :(得分:0)
如果您想编写代码异步,那么您需要真正深入到实际.net框架本身的最后一级,例如ADO.Net的SqlCommand.ExecuteReaderAsync
(所有主要ORM中都有相应的包装器)。
这将为您提供非阻塞调用的好处,这意味着在IO返回数据之前,将释放为WCF操作提供服务的线程。如果你在Task.Run()
中包含你的呼叫,你实际上是在你的应用领域使用通用线程池,所以你不能从优化线程的框架中受益,就像它对完整{{1 }}。
实质上:是的,如果要完全异步使用WCF,请使用await
的数据库访问。
否则,在没有await
的情况下同步执行所有操作以避免线程等待,只需返回Task.Run()
。