2013-04-09 5 views
3

В настоящее время я разрабатываю службу Windows в .net 4. Он подключается к WS, который отправляет обратно необходимую мне информацию. Я использую таймер: каждые х секунд сервис запрашивает у webservice информацию. Но чтобы избежать доступа к WS на каждом этапе, я хотел бы сохранить эти учетные данные в кеше.Служба Windows и кеш

Я искал googled и не нашел ничего подходящего для ситуации службы Windows (это всегда касается среды ASP.NET).

Я пробовал MemoryCache (от ObjectCache от System.Runtime.Caching) без успеха. Вот мой класс, я использую кеш.

Я в порядке или совершенно неправильно?

public class Caching 
{ 
    private const string CST_KEY = "myinfo"; 
    private const string CST_CACHENAME = "mycache"; 

    private MemoryCache _cache; 

    public Caching() 
    { 
     _cache = new MemoryCache(CST_CACHENAME); 
    } 

    private CacheItemPolicy CacheItemPolicy 
    { 
     get 
     { 
      return new CacheItemPolicy 
       { 
        SlidingExpiration = new TimeSpan(1, 0, 0, 0), 
        AbsoluteExpiration = new DateTimeOffset(0, 0, 1, 0, 0, 0, new TimeSpan(1, 0, 0, 0)) 
       }; 
     } 
    } 

    public bool SetClientInformation(ClientInformation client_) 
    { 
     if (_cache.Contains(CST_KEY)) 
      _cache.Remove(CST_KEY); 

     return _cache.Add(CST_KEY, client_, CacheItemPolicy); 
    } 

    public bool HasClientInformation() 
    { 
     return _cache.Contains(CST_KEY); 
    } 

    public ClientInformation GetClientInformation() 
    { 
     return _cache.Contains(CST_KEY) ? (ClientInformation) _cache.Get(CST_KEY) : null; 
    } 
} 

MemoryCache хороший класс для использования?

В [другом сообщении] [1] они предлагают ASP.NET Cache (System.Web.Caching), но это кажется странным в службе Windows, не так ли?

Если бы вы могли направить меня немного, было бы полезно.

Редактировать

Я изменил new DateTimeOffset(0, 0, 1, 0, 0, 0, new TimeSpan(1, 0, 0, 0)) по new DateTimeOffset(DateTime.UtcNow.AddHours(24)) без разницыи она прекрасно работает!

[1]: Caching for .NET (not in websites)выделенный текст

+0

это тот же самый вопрос: http://stackoverflow.com/questions/6059860/memorycache-add-returns-true-but-does-not-add-item-to-cache –

ответ

2

Попробуйте вместо этого.

cacheItemPolicy.AbsoluteExpiration = new DateTimeOffset(DateTime.UtcNow.AddHours(24)); 

В основном вы отсылали абсолютный срок годности год 0. Я не уверен, как что даже работы, приведенные в документации сказано, что DateTimeOffset нужен месяц, чтобы быть 1-12.

Вы должны получить аргумент за пределами исключения. ??? Если вы идете here

и запустить этот ...

с использованием системы;

namespace Dela.Mono.Examples 
{ 
    public class HelloWorld 
    { 
     public static void Main(string[] args) 
     { 
     Console.WriteLine(new DateTimeOffset(0, 0, 1, 0, 0, 0, new TimeSpan(1, 0, 0, 0))); 
     } 
    } 

Вы получите следующее исключение.

Compiling the source code.... 
$/usr/local/bin/mcs /tmp/136548353410035/csharp136548353410035.cs 2>&1 

Executing the program.... 
$mono /tmp/136548353410035/csharp136548353410035.exe 

Unhandled Exception: System.ArgumentOutOfRangeException: Argument is out of range. 
Parameter name: Parameters describe an unrepresentable DateTime. 
at System.DateTime..ctor (Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond) [0x00000] in <filename unknown>:0 
at System.DateTime..ctor (Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second) [0x00000] in <filename unknown>:0 
at System.DateTimeOffset..ctor (Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, TimeSpan offset) [0x00000] in <filename unknown>:0 
at Dela.Mono.Examples.HelloWorld.Main (System.String[] args) [0x00000] in <filename unknown>:0 
+0

Привет! Спасибо за Ваш ответ. Вы правы! Он отлично работает! У меня не было ошибок, поэтому я подумал, что это касается того, как я использовал объект MemoryCache или что-то в этом роде. Большое спасибо. – Gnial0id

Смежные вопросы