我们正在尝试缓存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);
}
}
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);
}
}