Кэширование службы WCF и преобразование данных в асинхронный режим - PullRequest
3 голосов
/ 03 мая 2019

Мы пытаемся кешировать данные службы WCF, поэтому, когда данные доступны в кеш-памяти, нам нужно возвращать кешированные данные из кеша как AsyncResult, поскольку данные относятся к типу объектов, а метод Start - IAsyncResult.

Здесь я не могу изменить тип возвращаемого значения, поскольку он является абстрактным членом в классе помощника.

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

public override IAsyncResult Start(object sender, EventArgs e, AsyncCallback cb, object extraData)
  {
   if(cache.Get("key")
     {
      //Needs to return the result Async format which is there as object in cache.
     }
  svc = new service.GetData(m_url);
  if (m_debug_mode) // not thread safe
    {
      return ((service.GetData)svc).BeginCallDataDebug(request, cb, extraData);
    }
   return ((service.GetData)svc).BeginCallData(request, cb, extraData);
   }

public override void End(IAsyncResult ar)
  {
    try
      {
        data = ((service.GetData)m_svc).EndCallData(ar);
        if(data !=null)
        cache.Add("key", data, null, absoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
      }

   catch(Exception ex)
    {
     Log(ex.message);
    }
  }

1 Ответ

1 голос
/ 07 мая 2019

System.Threading.Tasks.Task орудия IAsyncResult.

Если данные найдены в кеше, вы можете вернуть заполненный Task с результатом через Task.FromResult.В противном случае вы делаете вызов в службу.

public override IAsyncResult Start(object sender, EventArgs e, AsyncCallback cb, object extraData)
{
    Object cachedData = cache.Get("key");
    if (cachedData != null)
    {
        // Return cached data.
        return Task.FromResult<object>(cachedData);
    }

    // Make call to the service.
    svc = new service.GetData(m_url);
    if (m_debug_mode) // not thread safe
    {
        return ((service.GetData)svc).BeginCallDataDebug(request, cb, extraData);
    }
    return ((service.GetData)svc).BeginCallData(request, cb, extraData);
}

В методе End вы можете проверить тип IAsyncResult для доступа к значению результата.
(Или вы установилифлаг / поле состояния в методе Start о том, вызывали ли вы службу или нет; вы можете проверить поле svc службы, которое будет нулевым при использовании кэшированных данных.)

public override void End(IAsyncResult ar)
{
    try
    {
        Task<object> task = ar as Task<object>;
        if (task != null)
        {
            data = task.Result;
        }
        else
        {   
            data = ((service.GetData)m_svc).EndCallData(ar);
            if(data !=null)
                cache.Add("key", data, null, absoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
            }
        }
    }
    catch(Exception ex)
    {
        Log(ex.message);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...