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