//Constructor MUST be called on UI thread (we capture the UI synchronization context for use later) public JobStore() { IsLocalExecution = true; CurrentExecutionPoolText = "Local Execution"; PhysicalCoreCount = LocalPool.GetNumberOfPhysicalCores(); SelectedThreadCount = Properties.Settings.Default.SelectedThreadCount; //TODO: load setting from a previous session? if (SelectedThreadCount == 0) { SelectedThreadCount = PhysicalCoreCount; } ThreadOptionsList = Enumerable.Range(1, USER_THREAD_COUNT_MAX).ToList(); if (PhysicalCoreCount > USER_THREAD_COUNT_MAX) { ThreadOptionsList.Add(PhysicalCoreCount); } UiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); TrackedJobs = new List <JobViewModel>(); Manager = new JobManagerFramework.JobManager(SelectedThreadCount); Manager.Server.IsRemote = false; Manager.LoadSavedJobs(); Manager.JobAdded += Manager_JobAdded; Manager.JobCollectionAdded += JobCollectionAddedHandler; this.TrackedJobsChanged += (sender, args) => { PropertyChanged.Notify(() => HasNoRunningJobs); }; }
public void UsingLocalPool() { var localPool = new LocalPool(); var str1 = localPool.GetOrCreate("string"); var str2 = localPool.GetOrCreate("str"); var str3 = localPool.GetOrCreate(str2 + "ing"); var str4 = localPool.GetOrCreate(GetFromInput()); Assert.True(ReferenceEquals(str1, str3)); Assert.True(ReferenceEquals(str1, str4)); Assert.True(ReferenceEquals(str3, str4)); }
/// <summary> /// <see cref="LockPoolPointer(int)"/> のスレッド ローカル版。 /// /// マルチスレッド動作はあきらめる。 /// 用途がかなり限られるものの、GCに頼らないメモリ管理としてはオーバーヘッド極小のはず。 /// ここまで削ってまだ<see cref="GarbageCollection(int)"/>より2~3倍遅い。 /// Mark and Sweep はほんとに速い。 /// /// これが Mark and Sweep より遅くなってそうな要因は、 /// - プールを準備する部分が重い /// - 検索アルゴリズムの問題 /// - 一時変数 q が増えてるのでこれが最適化を阻害 /// - Delete 呼び出しのコスト /// というあたり。 /// </summary> public static (int x, int y) LocalPoolPointer(int loops) { using (var pool = new LocalPool(20)) return(Pointer(new LocalPool(20), loops)); }