/// <summary> /// /// </summary> /// <param name="trainingDataLoaderFactory">Must be thread-safe.</param> public RecServiceState(IMalTrainingDataLoaderFactory trainingDataLoaderFactory, MalTrainingData trainingData, IDictionary <int, IList <int> > prereqs) { m_trainingDataLoaderFactory = trainingDataLoaderFactory; JsonRecSourceTypes = GetJsonRecSourceTypes(); m_trainingData = trainingData; m_usernames = GetUsernamesFromTrainingData(m_trainingData); m_animes = m_trainingData.Animes; m_prereqs = prereqs; m_trainingDataLockAsync = new AsyncUpgradeableReaderWriterLock(); m_recSourcesLockAsync = new AsyncUpgradeableReaderWriterLock(); m_pendingRecSourcesLockAsync = new AsyncUpgradeableReaderWriterLock(); }
public TcpRecService(IMalTrainingDataLoaderFactory trainingDataLoaderFactory, int portNumber) { m_state = new RecServiceState(trainingDataLoaderFactory); try { Listener = new TcpListener(new IPEndPoint(IPAddress.Any, portNumber)); } catch { m_state.Dispose(); throw; } }
private IDictionary<int, string> m_usernames; // Always update this when updating m_trainingData. Is null when rec sources are finalized. #endregion Fields #region Constructors /// <summary> /// /// </summary> /// <param name="trainingDataLoaderFactory">Must be thread-safe.</param> public RecServiceState(IMalTrainingDataLoaderFactory trainingDataLoaderFactory) { m_trainingDataLoaderFactory = trainingDataLoaderFactory; JsonRecSourceTypes = GetJsonRecSourceTypes(); using (IMalTrainingDataLoader trainingDataLoader = trainingDataLoaderFactory.GetTrainingDataLoader()) { m_trainingData = LoadTrainingDataOnInit(trainingDataLoader); m_usernames = GetUsernamesFromTrainingData(m_trainingData); m_animes = m_trainingData.Animes; m_prereqs = LoadPrereqsOnInit(trainingDataLoader); } m_trainingDataLock = new ReaderWriterLockSlim(); m_recSourcesLock = new ReaderWriterLockSlim(); }
// Loads training data and prerequisites from the database in parallel and does not return until they are loaded. private static (MalTrainingData trainingData, IDictionary <int, IList <int> > prereqs) LoadInitialData(IMalTrainingDataLoaderFactory trainingDataLoaderFactory, CancellationToken serviceStopToken) { using (IMalTrainingDataLoader initialTrainingDataLoader = trainingDataLoaderFactory.GetTrainingDataLoader()) using (CancellationTokenSource trainingDataOtherFaultOrCancellation = new CancellationTokenSource()) using (CancellationTokenSource trainingDataCancel = CancellationTokenSource.CreateLinkedTokenSource(serviceStopToken, trainingDataOtherFaultOrCancellation.Token)) using (CancellationTokenSource prereqsOtherFaultOrCancellation = new CancellationTokenSource()) using (CancellationTokenSource prereqsCancel = CancellationTokenSource.CreateLinkedTokenSource(serviceStopToken, prereqsOtherFaultOrCancellation.Token)) { CancellableAsyncFunc <MalTrainingData> trainingDataAsyncFunc = new CancellableAsyncFunc <MalTrainingData>( () => LoadTrainingDataOnInitAsync(initialTrainingDataLoader, trainingDataCancel.Token), trainingDataOtherFaultOrCancellation); CancellableTask <MalTrainingData> trainingDataTask = trainingDataAsyncFunc.StartTaskEnsureExceptionsWrapped(); CancellableAsyncFunc <IDictionary <int, IList <int> > > prereqsAsyncFunc = new CancellableAsyncFunc <IDictionary <int, IList <int> > >( () => LoadPrereqsOnInit(initialTrainingDataLoader, prereqsCancel.Token), prereqsOtherFaultOrCancellation); CancellableTask <IDictionary <int, IList <int> > > prereqsTask = prereqsAsyncFunc.StartTaskEnsureExceptionsWrapped(); AsyncUtils.WhenAllCancelOnFirstExceptionDontWaitForCancellations(trainingDataTask, prereqsTask).ConfigureAwait(false).GetAwaiter().GetResult(); return(trainingDataTask.Task.Result, prereqsTask.Task.Result); } }
// Must not block public TcpRecService(int portNumber, IMalTrainingDataLoaderFactory trainingDataLoaderFactory, MalTrainingData trainingData, IDictionary <int, IList <int> > prereqs) { m_portNumber = portNumber; m_state = new RecServiceState(trainingDataLoaderFactory, trainingData, prereqs); }