<p>I've got a nice little class built that acts as a cache. Each item has an expiration TimeSpan or DateTime. Each time an attempt to access an item in the cache is made, the item's expiration is checked, and if it's expired, the item is removed from the cache and nothing is returned.</p>

<p>That's great for objects that are accessed frequently, but if an item is put in the cache and never accessed again, it's never removed, even though it's expired.</p>

<p>What's a good methodology for expiring such items from the cache?</p>

<p>Should I have a background thread infinitely enumerating every item in the cache to check if it's expired?</p>

You can implement an LRU (Least Recently Used) strategy, keep your items sorted by access time, when a new item is inserted into the cache
and
the cache is full you evicted the item that is last in that list. See
Cache algorithms
at Wikipedia.
If you want to expire immediately, i would still only do that when things are accessed. I.e. when the cache object is accessed and it's time has expired refetch it.