/// <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();
        }
Exemple #4
0
        // 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);
                            }
        }
Exemple #5
0
 // 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);
 }