Я пытаюсь сделать метод WCF REST полностью асинхронным (я не хочу ничего блокировать). По сути, у меня есть простой сервис с тремя слоями: Service, Business Logic и Data Access Layer. Уровень доступа к данным имеет доступ к базе данных, и для получения ответа от этого метода может потребоваться несколько секунд.
Я не очень хорошо понимаю, как цепочки всех этих методов работают. Может кто-то, пожалуйста, помогите мне заполнить образец, который я пытаюсь написать ниже? Я не очень хорошо понимаю шаблон, используемый 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
}
}
}