【发布时间】:2017-09-11 13:06:12
【问题描述】:
我正在构建 WCF 服务,我需要对构建异步方法进行一些说明。
功能应该是当一个请求到达时,它包含一个授权令牌形式的认证信息,它会被检查,如果授权通过,那么实际的功能就会被执行。
首先,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:如果我要异步更改控制器方法,是否可以修改它们,使它们看起来像这样:
return await System.Threading.Tasks.Task.Run(() =>
{
//DO DB STUFF
}
【问题讨论】:
标签: c# wcf asynchronous async-await