Пример #1
0
        public void TestConcurrentCacheAccess()
        {
            var         mockFileSystem = new MockFileSystem();
            var         diskCache      = new DiskCache("c:\\CacheRoot", 10, mockFileSystem);
            long        cacheFill      = 0;
            List <Task> tasks          = new List <Task>();

            for (int i = 0; i < 24; i++)
            {
                var t = Task.Run(async() =>
                {
                    for (int k = 0; k < 100; k++)
                    {
                        for (int j = 0; j < 40; j++)
                        {
                            var keyString  = j.ToString();
                            var cacheEntry = await diskCache.GetOrAddAsync(keyString,
                                                                           (key, sink, cacheControl) =>
                            {
                                Interlocked.Increment(ref cacheFill);
                                var keystream = key.StringToStream();
                                return(keystream.CopyToAsync(sink));
                            }, new CacheControl(), CancellationToken.None);

                            try {
                                var cacheEntryString = cacheEntry.Value().StreamToString();
                                Assert.AreEqual(keyString, cacheEntryString);
                            } finally
                            {
                                await cacheEntry.DisposeAsync();
                            }
                        }
                    }
                });
                tasks.Add(t);
            }
            Task.WaitAll(tasks.ToArray());
            Assert.AreEqual(10, mockFileSystem.DirectoryGetFiles("c:\\CacheRoot\\tmp").Length);
        }