public void Dispose() { if (Disposed) { return; } Disposed = true; MainLoop.QueueWait(() => { PeerListener.Stop(); listenManager.SetListener(null); DhtListener.Stop(); DhtEngine.Dispose(); DiskManager.Dispose(); LocalPeerDiscovery.Stop(); }); }
public ClientEngine (EngineSettings settings, Factories factories) { settings = settings ?? throw new ArgumentNullException (nameof (settings)); Factories = factories ?? throw new ArgumentNullException (nameof (factories)); // This is just a sanity check to make sure the ReusableTasks.dll assembly is // loadable. GC.KeepAlive (ReusableTasks.ReusableTask.CompletedTask); PeerId = GeneratePeerId (); Settings = settings ?? throw new ArgumentNullException (nameof (settings)); CheckSettingsAreValid (Settings); allTorrents = new List<TorrentManager> (); dhtNodeLocker = new SemaphoreSlim (1, 1); publicTorrents = new List<TorrentManager> (); Torrents = new ReadOnlyCollection<TorrentManager> (publicTorrents); DiskManager = new DiskManager (Settings, Factories); ConnectionManager = new ConnectionManager (PeerId, Settings, Factories, DiskManager); listenManager = new ListenManager (this); PortForwarder = Factories.CreatePortForwarder (); MainLoop.QueueTimeout (TimeSpan.FromMilliseconds (TickLength), delegate { if (IsRunning && !Disposed) LogicTick (); return !Disposed; }); downloadLimiter = new RateLimiter (); downloadLimiters = new RateLimiterGroup { new DiskWriterLimiter(DiskManager), downloadLimiter, }; uploadLimiter = new RateLimiter (); uploadLimiters = new RateLimiterGroup { uploadLimiter }; PeerListener = (settings.ListenEndPoint == null ? null : Factories.CreatePeerConnectionListener (settings.ListenEndPoint)) ?? new NullPeerListener (); listenManager.SetListener (PeerListener); DhtListener = (settings.DhtEndPoint == null ? null : Factories.CreateDhtListener (settings.DhtEndPoint)) ?? new NullDhtListener (); DhtEngine = (settings.DhtEndPoint == null ? null : Factories.CreateDht ()) ?? new NullDhtEngine (); Dht = new DhtEngineWrapper (DhtEngine); DhtEngine.SetListenerAsync (DhtListener).GetAwaiter ().GetResult (); DhtEngine.StateChanged += DhtEngineStateChanged; DhtEngine.PeersFound += DhtEnginePeersFound; LocalPeerDiscovery = new NullLocalPeerDiscovery (); RegisterLocalPeerDiscovery (settings.AllowLocalPeerDiscovery ? Factories.CreateLocalPeerDiscovery () : null); }
public ClientEngine(EngineSettings settings) { settings = settings ?? throw new ArgumentNullException(nameof(settings)); // This is just a sanity check to make sure the ReusableTasks.dll assembly is // loadable. GC.KeepAlive(ReusableTasks.ReusableTask.CompletedTask); PeerId = GeneratePeerId(); Settings = settings ?? throw new ArgumentNullException(nameof(settings)); CheckSettingsAreValid(Settings); allTorrents = new List <TorrentManager> (); publicTorrents = new List <TorrentManager> (); Torrents = new ReadOnlyCollection <TorrentManager> (publicTorrents); DiskManager = new DiskManager(Settings); DiskManager.ChangePieceWriter(new DiskWriter(Settings.MaximumOpenFiles)); ConnectionManager = new ConnectionManager(PeerId, Settings, DiskManager); listenManager = new ListenManager(this); PortForwarder = new MonoNatPortForwarder(); MainLoop.QueueTimeout(TimeSpan.FromMilliseconds(TickLength), delegate { if (IsRunning && !Disposed) { LogicTick(); } return(!Disposed); }); downloadLimiter = new RateLimiter(); downloadLimiters = new RateLimiterGroup { new DiskWriterLimiter(DiskManager), downloadLimiter, }; uploadLimiter = new RateLimiter(); uploadLimiters = new RateLimiterGroup { uploadLimiter }; Listener = PeerListenerFactory.CreateTcp(settings.ListenPort); listenManager.SetListener(Listener); DhtListener = DhtListenerFactory.CreateUdp(settings.DhtPort); DhtEngine = settings.DhtPort == -1 ? new NullDhtEngine() : DhtEngineFactory.Create(DhtListener); DhtEngine.StateChanged += DhtEngineStateChanged; DhtEngine.PeersFound += DhtEnginePeersFound; RegisterLocalPeerDiscovery(settings.AllowLocalPeerDiscovery && settings.ListenPort > 0 ? LocalPeerDiscoveryFactory.Create(settings.ListenPort) : null); }