使用线程使用HttpContext Cache

时间:2015-10-29 17:49:10

标签: c# asp.net multithreading caching httpcontext

我的应用程序有以下缓存实现:

public static class Keys
{
    public const string CacheKey = "cachekey";
}

public interface ICache
{
    string QueryCachedData(string param);
}

应用程序在Global.asax

中启动时加载数据
//Global.asax
protected void Application_Start(object sender, EventArgs e)
{
    //instantiates the repository
    HttpContext.Current.Application[Keys.CacheKey] = repository.getDataView();
}

实现从HttpContext.Current

恢复数据
public class Cache : ICache
{
    private Cache() { }
    private static Cache _instance = null;
    public static Cache GetInstance()
    {
        if (_instance == null)
            _instance = new Cache();
        return _instance;
    }
    private System.Data.DataView GetCachedData()
    {
        if (HttpContext.Current.Application[Keys.CacheKey] == null)
        {
            //instantiates the repository
            HttpContext.Current.Application[Keys.CacheKey] = repository.getDataView();
        }
        return HttpContext.Current.Application[Keys.CacheKey] as System.Data.DataView;
    }
    private readonly Object _lock = new Object();
    public string QueryCachedData(string param)
    {
        lock (_lock)
        {
            var data = GetCachedData();
            //Execute query
            return result; 
        }
    }
}

在某些时候我需要使用缓存来使用以下类消耗一些第三方Web服务...

public class ThirdPartyWebserviceConsumer
{
    ICache _cache;
    int _provider;
    public ThirdPartyWebserviceConsumer(int provider, ICache cache)
    {
        _cache = cache;
        _provider = provider;
    }
    public result DoSomething()
    {
        var info = _cache.QueryCachedData(param);
    }
}

...使用多线程:

public List<Result> Foo(ICache cache, List<int> collectionOfProviders)
{
    List<Result> results = new List<Result>();
    List<Task> taskList = new List<Task>();
    foreach (var provider in collectionOfProviders)
    {
        var task = new Task<Result>(() => new ThirdPartyWebserviceConsumer(provider, cache).DoSomething());
        task.Start();
        task.ContinueWith(task =>
        {
            results.Add(task.Result);
        });
        taskList.Add(task);
    }
    Task.WaitAll(taskList.ToArray());
    return results;
}

我的问题是在thead上下文中HttpContext.Current.Application为null。 我有什么选择?有一些形式来访问线程中的HttpContext?或者可以在线程之间共享的其他类型的缓存?

1 个答案:

答案 0 :(得分:1)

  

我的问题是在thead上下文中HttpContext.Current.Application为null。我有什么选择?

HttpContext.Current绑定到处理当前请求的托管线程。

如果您需要来自当前上下文的数据用于另一个线程,您需要先将该数据从当前上下文中复制出来并将其传递给您的单独线程。