public void TestParallelMixedAddAndRemove() { var list = new ConcurrentSortedList <int>(); var prepare = Enumerable.Range(0, 10000).Select(x => x * 2).ToList(); Parallel.ForEach(prepare, x => list.Add(x)); var tasks = new Task[4000]; for (var i = 0; i < 2000; i++) { var id = i; tasks[i] = new Task(() => Assert.True(list.Remove(id * 2))); } for (var i = 0; i < 2000; i++) { var id = i; tasks[i + 2000] = new Task(() => list.Add(id * 2 + 1)); } Parallel.ForEach(tasks, x => x.Start()); Task.WaitAll(tasks); Assert.Equal(10000, list.Count); foreach (var i in list) { if (i < 4000) { Assert.Equal(1, i % 2); } else { Assert.Equal(0, i % 2); } } AssertIntList(list, 10000); }
public void BinarySearchTest() { int a, b; var csl = new ConcurrentSortedList(); (a, b) = csl.BinarySearch(1); Assert.Equal(-1, a); Assert.Equal(0, b); csl.Add(1); (a, b) = csl.BinarySearch(1); Assert.Equal(0, a); Assert.Equal(0, b); (a, b) = csl.BinarySearch(0); Assert.Equal(-1, a); Assert.Equal(0, b); (a, b) = csl.BinarySearch(100); Assert.Equal(csl.Count - 1, a); Assert.Equal(csl.Count, b); csl.Add(2); (a, b) = csl.BinarySearch(1); Assert.Equal(0, a); Assert.Equal(0, b); (a, b) = csl.BinarySearch(2); Assert.Equal(1, a); Assert.Equal(1, b); (a, b) = csl.BinarySearch(0); Assert.Equal(-1, a); Assert.Equal(0, b); (a, b) = csl.BinarySearch(100); Assert.Equal(csl.Count - 1, a); Assert.Equal(csl.Count, b); csl.Add(4); (a, b) = csl.BinarySearch(1); Assert.Equal(0, a); Assert.Equal(0, b); (a, b) = csl.BinarySearch(2); Assert.Equal(1, a); Assert.Equal(1, b); (a, b) = csl.BinarySearch(4); Assert.Equal(2, a); Assert.Equal(2, b); (a, b) = csl.BinarySearch(0); Assert.Equal(-1, a); Assert.Equal(0, b); (a, b) = csl.BinarySearch(100); Assert.Equal(csl.Count - 1, a); Assert.Equal(csl.Count, b); (a, b) = csl.BinarySearch(3); Assert.Equal(1, a); Assert.Equal(2, b); }
public void AddAndContainsTest() { var csl = new ConcurrentSortedList(); Assert.Equal(0, csl.Count); Assert.False(csl.Contains(12)); csl.Add(12); Assert.Equal(1, csl.Count); Assert.True(csl.Contains(12)); Assert.False(csl.Contains(15)); csl.Add(15); Assert.Equal(2, csl.Count); Assert.True(csl.Contains(12)); Assert.True(csl.Contains(15)); Assert.False(csl.Contains(5)); csl.Add(5); Assert.Equal(3, csl.Count); Assert.True(csl.Contains(12)); Assert.True(csl.Contains(15)); Assert.True(csl.Contains(5)); Assert.False(csl.Contains(13)); Assert.Equal((UInt64)5, csl[0]); Assert.Equal((UInt64)15, csl[2]); Assert.Equal((UInt64)12, csl[1]); csl.Add(12); // repeat Assert.Equal(3, csl.Count); Assert.True(csl.Contains(12)); Assert.True(csl.Contains(15)); Assert.True(csl.Contains(5)); Assert.False(csl.Contains(13)); Assert.Equal((UInt64)5, csl[0]); Assert.Equal((UInt64)12, csl[1]); Assert.Equal((UInt64)15, csl[2]); csl.Add(13); Assert.Equal(4, csl.Count); Assert.True(csl.Contains(12)); Assert.True(csl.Contains(15)); Assert.True(csl.Contains(5)); Assert.True(csl.Contains(13)); Assert.False(csl.Contains(100)); // random Assert.Equal((UInt64)5, csl[0]); Assert.Equal((UInt64)12, csl[1]); Assert.Equal((UInt64)13, csl[2]); Assert.Equal((UInt64)15, csl[3]); }
public void TestMultithreadRemoveAndContains() { var list = new ConcurrentSortedList <int>(); var idList = Enumerable.Range(0, 10000).ToList(); Parallel.ForEach(idList, x => list.Add(x)); Parallel.ForEach(idList, x => { if (x < 5000) { Assert.True(list.Remove(x)); } else { Assert.True(list.Contains(x)); } }); Assert.Equal(5000, list.Count); for (var i = 0; i < 5000; i++) { Assert.False(list.Contains(idList[i])); } AssertIntList(list, 5000); }
public void TestSingleThreadRemove() { var list = new ConcurrentSortedList <Order>(new OrderComparer()); var idList = ConstructIdList(10000); Parallel.ForEach(idList, x => list.Add(new Order { Id = x, Name = x.ToString() })); for (var i = 0; i < 1000; i++) { Assert.True(list.Remove(new Order { Id = idList[i], Name = idList[i].ToString() })); } Assert.Equal(9000, list.Count); for (var i = 0; i < 1000; i++) { Assert.False(list.Contains(new Order { Id = idList[i], Name = idList[i].ToString() })); } for (var i = 0; i < 9000; i++) { Assert.True(list.Contains(new Order { Id = idList[i + 1000], Name = idList[i + 1000].ToString() })); } AssertOrderList(list, 9000); }
public void TestSingleThreadContains() { var list = new ConcurrentSortedList <Order>(new OrderComparer()); var idList = ConstructIdList(10000); Parallel.ForEach(idList, x => list.Add(new Order { Id = x, Name = x.ToString() })); foreach (var i in idList) { Assert.True(list.Contains(new Order { Id = i, Name = i.ToString() })); } var random = new Random((int)DateTime.Now.Ticks & 0x0000ffff); for (var i = 0; i < 20; i++) { var rand = random.Next(); if (!idList.Contains(rand)) { Assert.False(list.Contains(new Order { Id = rand, Name = rand.ToString() })); } } }
public void TestSingleThreadAddDuplicate() { var list = new ConcurrentSortedList <Order>(new OrderComparer()); var idList = ConstructIdList(10000); Parallel.ForEach(idList, x => list.Add(new Order { Id = x, Name = x.ToString() })); var tasks = new Task[1000]; for (var i = 0; i < 1000; i++) { var id = i; tasks[i] = Task.Factory.StartNew(() => list.Add(new Order { Id = id, Name = id.ToString() })); } Task.WaitAll(tasks); Assert.Equal(11000, list.Count); AssertOrderList(list, 11000); }
public void TestMultithreadAddAndReomove() { var list = new ConcurrentSortedList <int>(); var idList = Enumerable.Range(0, 10000).ToList(); var newIdList = Enumerable.Range(10000, 2000).ToList(); Parallel.ForEach(idList, x => list.Add(x)); var tasks = new Task[3000]; for (var i = 0; i < 2000; i++) { var id = newIdList[i]; tasks[i] = new Task(() => list.Add(id)); } for (var i = 0; i < 1000; i++) { var id = idList[i]; tasks[i + 2000] = new Task(() => list.Remove(id)); } Parallel.ForEach(tasks, x => x.Start()); Task.WaitAll(tasks); Assert.Equal(11000, list.Count); for (var i = 0; i < 2000; i++) { Assert.True(list.Contains(newIdList[i])); } for (var i = 0; i < 1000; i++) { Assert.False(list.Contains(idList[i])); } for (var i = 0; i < 9000; i++) { Assert.True(list.Contains(idList[i + 1000])); } AssertIntList(list, 11000); }
public void TestMultithreadAddAndContains() { var list = new ConcurrentSortedList <int>(); var idList = Enumerable.Range(0, 5000).ToList(); Parallel.ForEach(idList, x => list.Add(x)); var newIdList = Enumerable.Range(5000, 5000).ToList(); var tasks = new Task[10000]; for (var i = 0; i < 5000; i++) { var id = newIdList[i]; tasks[i] = new Task(() => list.Add(id)); } for (var i = 0; i < 5000; i++) { var id = i; tasks[i + 5000] = new Task(() => Assert.True(list.Contains(id))); } Parallel.ForEach(tasks, x => x.Start()); Task.WaitAll(tasks); Assert.Equal(10000, list.Count); AssertIntList(list, 10000); }
public void TestSingleThreadAdd() { var list = new ConcurrentSortedList <Order>(new OrderComparer()); var random = new Random((int)DateTime.Now.Ticks & 0x0000ffff); for (var i = 0; i < 10000; i++) { var number = random.Next(); var order = new Order { Id = number, Name = number.ToString() }; list.Add(order); } AssertOrderList(list, 10000); }
public void TestMultithreadRemoveAndThenEnumerate() { var list = new ConcurrentSortedList <int>(); var idList = Enumerable.Range(0, 10000).ToList(); var removeList = Enumerable.Range(0, 5000).Select(x => x * 2).ToList(); Parallel.ForEach(idList, x => list.Add(x)); Parallel.ForEach(removeList, x => list.Remove(x)); Assert.Equal(5000, list.Count); foreach (var i in list) { Assert.Equal(1, i % 2); } AssertIntList(list, 5000); }
public void TestParallelAdd() { var list = new ConcurrentSortedList <Order>(new OrderComparer()); var random = new Random((int)DateTime.Now.Ticks & 0x0000ffff); var idList = new List <int>(); for (var i = 0; i < 10000; i++) { idList.Add(random.Next()); } Parallel.ForEach(idList, x => list.Add(new Order { Id = x, Name = x.ToString() })); AssertOrderList(list, 10000); }
public MusicLoader(string syncDir, string token, long userId) { DependencyUtility.BuildUp(this); syncDirectory = syncDir; this.userId = userId; api = new VkApi(); api.Authorize(token, userId); api.Invoke("stats.trackVisitor", new Dictionary<string, string>(), true); // статистика посещаемости приложения remoteAudioSizeHelper = new RemoteAudioSizeHelper(Path.Combine(AppPaths.SettingsPath, "sizes.dat")); tracks = new ConcurrentSortedList<int, Track>(); int key = 0; foreach (var track in TrackRepository.GetTracks()) tracks.Add(key++, track); }
public void ConcurrentSortedListAdd_InParallel_CorreclyAddedItems_Test() { var csl = new ConcurrentSortedList<int, string>(); var list = new List<string> { "4", "2", "7", "5", "1" }; Parallel.ForEach(list, item => csl.Add(int.Parse(item), item)); Assert.Equal(5, csl.Count); Assert.Equal("1",csl.Values[0]); Assert.Equal("2", csl.Values[1]); Assert.Equal("4", csl.Values[2]); Assert.Equal("5", csl.Values[3]); Assert.Equal("7", csl.Values[4]); }
public void ConcurrentSortedListAdd_InParallel_CorreclyAddedItems_Test() { var csl = new ConcurrentSortedList <int, string>(); var list = new List <string> { "4", "2", "7", "5", "1" }; Parallel.ForEach(list, item => csl.Add(int.Parse(item), item)); Assert.AreEqual(5, csl.Count); Assert.AreEqual("1", csl.Values[0]); Assert.AreEqual("2", csl.Values[1]); Assert.AreEqual("4", csl.Values[2]); Assert.AreEqual("5", csl.Values[3]); Assert.AreEqual("7", csl.Values[4]); }
public void ConcurrentSortedListCount_InParallel_CorreclyGetCount_Test() { var csl = new ConcurrentSortedList<int, string>(); var list = new List<string> { "4", "2", "7", "5", "1" }; int count = 0; Parallel.ForEach(list, item => csl.Add(int.Parse(item), item)); Parallel.ForEach(csl.Values, i => { count = csl.Count; }); Assert.Equal(5,count); }
public void ConcurrentSortedListCount_InParallel_CorreclyGetCount_Test() { var csl = new ConcurrentSortedList <int, string>(); var list = new List <string> { "4", "2", "7", "5", "1" }; int count = 0; Parallel.ForEach(list, item => csl.Add(int.Parse(item), item)); Parallel.ForEach(csl.Values, i => { count = csl.Count; }); Assert.AreEqual(5, count); }
public void TestMultithreadAdd() { var list = new ConcurrentSortedList <Order>(new OrderComparer()); var tasks = new Task[10000]; var random = new Random((int)DateTime.Now.Ticks & 0x0000ffff); for (var i = 0; i < 10000; i++) { tasks[i] = Task.Factory.StartNew(() => { var id = 0; lock (locker) { id = random.Next(); } list.Add(new Order { Id = id, Name = id.ToString() }); }); } Task.WaitAll(tasks); AssertOrderList(list, 10000); }
/// <summary> /// Run each of the Service/Type in the Collection /// </summary> public void Run() { while (m_Running) { ToDoList.AddRange(DoneList); DoneList.Clear(); foreach (var item in new ConcurrentSortedList <TimeSpan, TypeParam>(ToDoList)) { if (string.IsNullOrWhiteSpace(item.Value.Type)) { continue; } var toRun = DateTime.Now.Date.Add(item.Key); if (toRun < DateTime.Now) { continue; } else { Thread.Sleep(toRun.Subtract(DateTime.Now)); } Task.Factory.StartNew((o) => { #region SUB THREAD FUNCTION KeyValuePair <TimeSpan, TypeParam> job = (KeyValuePair <TimeSpan, TypeParam>)o; try { string[] typeName = job.Value.Type.Split(','); string assemblyName = typeName[0]; string typeToInstantiate = typeName[1]; if (!m_assemblies.ContainsKey(assemblyName)) { FireInfo(string.Concat("Loading assembly ", assemblyName)); var asm = Assembly.LoadFile(assemblyName); m_assemblies[assemblyName] = asm; } FireInfo(string.Format("Calling {0}.{1} ", typeToInstantiate, job.Value.Method)); Type class1 = m_assemblies[assemblyName].GetType(typeToInstantiate); Object obj = Activator.CreateInstance(class1); MethodInfo mi = class1.GetMethod(job.Value.Method); // Invoke method ('null' for no parameters). //Get the parameters string[] p = job.Value.Parameters.Split(','); object[] paramArray = new object[p.Length]; if (!string.IsNullOrWhiteSpace(job.Value.Parameters)) { FireInfo(string.Concat("Parameters ", job.Value.Parameters)); for (int cnt = 0; cnt < paramArray.Length; cnt++) { string[] p2 = p[cnt].Split('-'); switch (p2[1]) { case "string": paramArray[cnt] = p2[0]; break; case "int": paramArray[cnt] = Convert.ToInt32(p2[0]); break; case "bool": paramArray[cnt] = Convert.ToBoolean(p2[0]); break; case "double": paramArray[cnt] = Convert.ToDouble(p2[0]); break; case "char": paramArray[cnt] = Convert.ToChar(p2[0]); break; case "decimal": paramArray[cnt] = Convert.ToDecimal(p2[0]); break; } } mi.Invoke(obj, paramArray); } else { mi.Invoke(obj, null); } } catch (Exception ex) { FireError(ex); } finally { ToDoList.Remove(job.Key); DoneList.Add(job.Key, job.Value); } #endregion }, item); Thread.Yield(); } var tillTomorrow = DateTime.Now.Date.AddDays(1) - DateTime.Now; Thread.Sleep(tillTomorrow); } }
private void Load() { if (!Monitor.TryEnter(musicLoadLock)) return; OnSynchronizationStarted(); var audios = api.Audio.Get(userId); OnProgressChanged(new ProgressStatus { TotalCount = audios.Count }); var addedList = new List<Track>(); var trackIDs = tracks.Values.Select(t => t.Id).ToList(); var tracksCount = tracks.Count; tracks = new ConcurrentSortedList<int, Track>(); int loadedTracksCount = 0; var tracksDictionary = audios.ToDictionary(audio => audio, audio => new Track().Update(audio)); var trackIndexes = tracksDictionary.Values.Select((s, i) => new { s, i }).ToDictionary(x => x.s, x => x.i); Parallel.ForEach(audios, new ParallelOptions { MaxDegreeOfParallelism = 4 }, (audio) => { var track = tracksDictionary[audio]; var fileName = track.GetFilePath(); var fi = new FileInfo(fileName); if (remoteAudioSizeHelper.GetSize(audio) > 0) { if (!trackIDs.Contains(audio.Id)) { addedList.Add(track); } if (!fi.Exists || fi.Length < remoteAudioSizeHelper.GetSize(audio)) { TrySaveFileFromUrl(audio.Url.ToString(), fileName); } tracks.Add(trackIndexes[track], track); OnAddedOneTrack(track, tracks.Values.ToList()); Interlocked.Increment(ref loadedTracksCount); OnProgressChanged(new ProgressStatus { TotalCount = audios.Count, DoneCount = loadedTracksCount }); } }); remoteAudioSizeHelper.Save(); TrackRepository.SaveTracks(tracks.Values.ToList()); // TODO do we really need deleted list? var deletedList = GetDeletedTrackIDs(); OnCompleted(); lastLoadTime = DateTime.UtcNow; Monitor.Exit(musicLoadLock); }