WCF资源上的异步调用

时间:2017-04-15 11:44:41

标签: c# wcf asynchronous async-await

我正在构建一个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
}

1 个答案:

答案 0 :(得分:0)

如果您想编写代码异步,那么您需要真正深入到实际.net框架本身的最后一级,例如ADO.Net的SqlCommand.ExecuteReaderAsync(所有主要ORM中都有相应的包装器)。

这将为您提供非阻塞调用的好处,这意味着在IO返回数据之前,将释放为WCF操作提供服务的线程。如果你在Task.Run()中包含你的呼叫,你实际上是在你的应用领域使用通用线程池,所以你不能从优化线程的框架中受益,就像它对完整{{1 }}。

实质上:是的,如果要完全异步使用WCF,请使用await的数据库访问。 否则,在没有await的情况下同步执行所有操作以避免线程等待,只需返回Task.Run()