WCF. В чем разница в производительности между асинхронными и синхронизирующими методами в службе? - PullRequest
2 голосов
/ 04 октября 2011

позволяет предположить, что у нас есть два рабочих контракта, определенных для службы 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 также имеет пул потоков внутри, поэтому каждая операция ввода-вывода может быть завершена в другом потоке.Помимо запуска нового потока с помощью Task.Factory.StartNew

Есть ли какая-либо разница между вызовами синхронизирующего и асинхронного серверов с точки зрения производительности, если доступ к базе данных осуществляется через EntityFramework и хотя и блокируется?

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Эти две версии одинаковы.Но в целом асинхронная версия может быть гораздо более эффективной, чем асинхронный вызов синхронной версии.

Например, если мы используем FileStream или TcpListerner , чем вызов асинхронной версииBeginRead и BeginAcceptSocket были бы намного эффективнее, чем вызов соответствующих синхронных версий, таких как Read и AcceptSocket.Это потому, что эти асинхронные функции используют базовый асинхронный API, предоставляемый операционной системой.

Например, TcpListener может использовать порты завершения ввода-вывода для взаимодействия с другим tcp-клиентом, и с этим подходом вы можете легко асинхронно взаимодействовать с 10K клиентов без задержек.FileSteam может использовать перекрывающуюся структуру для базовых асинхронных операций, которые потребляют меньше ресурсов, чем синхронная версия.

Таким образом, если асинхронный метод ваших служб также может использовать некоторый асинхронный базовый API, ваша асинхронная версия может быть намного более эффективной, чем простая асинхронная версияэто вызывает синхронизацию версии в другом потоке.

1 голос
/ 04 октября 2011

Здесь нет никакого значения для асинхронного метода, так как вы все еще вызываете метод синхронизации, который в какой-то момент заблокирует поток. Асинхронизация только что заработает, когда она полностью переходит к неблокирующей операции, такой как дисковый / сетевой ввод-вывод. Просто напишите простую версию синхронизации и позвольте WCF делать свое дело.

...