【问题标题】:WCF. What is the performance difference between async and sync methods on a service?WCF。服务上的异步和同步方法之间的性能差异是什么?
【发布时间】:2011-11-30 10:40:54
【问题描述】:

假设我们在 wcf 服务上定义了两个操作协定,同步和异步一个。有两个示例:

public void SubscribeSingle(int userId)
{
    var clientId = this.OperationContext.GetClientId();
    var session = this.OperationContext.GetPollingDuplexSession();

    if (string.IsNullOrEmpty(clientId) || session == null || userId == 0)
    {
        return;
    }

    this.InternalSubscribeSingle(userId, clientId, session.SessionId);
}

public IAsyncResult BeginUnsubscribeSingle(int userId, AsyncCallback callback, object state)
{
    var clientId = this.OperationContext.GetClientId();
    var session = this.OperationContext.GetPollingDuplexSession();

    if (string.IsNullOrEmpty(clientId) || session == null)
    {
        return null;
    }

    var asyncResult = new VoidAsyncResult(callback, state);
    Task.Factory.StartNew(() =>
    {
        try
        {
            this.InternalUnsubscribeSingle(userId, clientId);
            asyncResult.SetAsCompleted(false);
        }
        catch (Exception ex)
        {
            asyncResult.SetAsCompleted(ex, false);
        }
    });
    return asyncResult;
}


public void EndUnsubscribeSingle(IAsyncResult result)
{
    var response = result as VoidAsyncResult;
    if (response != null)
    {
        response.EndInvoke();
    }
}

据我了解,WCF 服务内部也有一个线程池,因此每个 I/O 操作都可能在另一个线程上完成。以及使用 Task.Factory.StartNew 启动新线程

如果数据库访问是通过 EntityFramework 并通过阻塞进行的,从性能的角度来看,同步服务器调用和异步服务器调用有什么区别?

【问题讨论】:

标签: c# .net wcf asynchronous task


【解决方案1】:

这两个版本是一样的。但总的来说,异步版本比异步调用同步版本效率更高。

例如,如果我们使用FileStreamTcpListerner,那么调用异步版本的BeginRead 和BeginAcceptSocket 应该比调用适当的同步版本(如Read 和AcceptSocket)更有效。那是因为那些使用操作系统提供的底层异步API的异步函数。

例如,TcpListener 可以使用 IO 完成端口与另一个 tcp 客户端进行交互,通过这种方法,您可以轻松地与 10K 的客户端进行异步交互,而不会出现延迟。 FileSteam 可以将 Overlapped 结构用于底层异步操作,这将比同步版本消耗更少的资源。

因此,如果您的服务异步方法也可以使用一些异步底层 API,那么您的异步版本可能比在不同线程中调用同步版本的简单异步版本更有效。

【讨论】:

    【解决方案2】:

    这里的异步方法没有任何价值,因为您仍在调用同步方法,该方法会在某些时候阻塞线程。异步只有在一直到像磁盘/网络 IO 这样的非阻塞操作时才会有所收获。只需编写简单的同步版本,让 WCF 完成它的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多