Как сделать метод REST WCF полностью асинхронным с библиотекой параллельных задач?

Я пытаюсь сделать метод WCF REST полностью асинхронным (я не хочу нигде блокировать). По сути, у меня есть простой сервис с 3 уровнями: сервис, бизнес-логика и уровень доступа к данным. Уровень доступа к данным обращается к базе данных, и получение ответа от этого метода может занять несколько секунд.

Я не очень хорошо понимаю, как работают цепочки всех этих методов. Может ли кто-нибудь помочь мне заполнить образец, который я пытаюсь написать ниже? Я не очень хорошо понимаю шаблон, используемый WCF, и не нашел много документации по этому вопросу.

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

using System;
using System.Collections.Generic;
using System.Runtime.Remoting.Messaging;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Threading.Tasks;

namespace WcfRestService1
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = 
        AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class Service1
    {
        private BusinessLogic bll = new BusinessLogic();

        // Synchronous version
        [WebGet(UriTemplate = "/sync")]
        public string GetSamples()
        {
            return bll.ComputeData();
        }

        // Asynchronous version - Begin
        [WebGet(UriTemplate = "/async")]
        [OperationContract(AsyncPattern = true)]
        public IAsyncResult BeginGetSampleAsync(AsyncCallback callback, 
            object state)
        {
            Task<string> t = bll.ComputeDataAsync();

            // What am I suppose to return here
            // return t.AsyncState; ???
        }

        // Asynchronous version - End
        public List<SampleItem> EndGetSampleAsync(IAsyncResult result)
        {
            // How do I handle the callback here?
        }
    }

    public class BusinessLogic
    {
        public Task<string> ComputeDataAsync()
        {
            DataAccessLayer dal = new DataAccessLayer();
            return dal.GetData();
        }

        public string ComputeData()
        {
            Task<string> t = this.ComputeDataAsync();

            // I am blocking... Waiting for the data
            t.Wait();

            return t.Result;
        }
    }

    public class DataAccessLayer
    {
        public Task<string> GetData()
        {
            // Read data from disk or network or db
        }
    }
}
21
задан Martin 28 November 2011 в 03:58
поделиться