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

Caching WCF service and Convert data as Async

我们正在尝试缓存 WCF 服务的数据,因此当数据在缓存内存中可用时,我们需要 return 将缓存中的数据缓存为 AsyncResult,因为数据是对象类型并且启动方法是 IAsyncResult.

这里我无法更改 return 类型,因为它是助手 class 中的抽象成员。

此外,我无法检查父页面缓存是否可用并通过,因为这需要全局更改,以便使用此服务的人可以使用它。

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);
    }
  }

System.Threading.Tasks.Task 实施 IAsyncResult

如果在缓存中找到数据,您可以 return 完成 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 方法中设置一个状态 flag/field 关于你是否调用了服务;你可以检查服务 svc 字段,它在缓存时将为 null正在使用数据。)

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);
    }
}