缓存 WCF 服务并将数据转换为异步

问题描述 投票:0回答:1

我们正在尝试缓存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);
    }
  }
c# asp.net wcf caching
1个回答
1
投票

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.