static void Main(string[] args) { // optimizing IOCP performance int minWorkerThreads; int minCompletionPortThreads; ThreadPool.GetMinThreads(out minWorkerThreads, out minCompletionPortThreads); ThreadPool.SetMinThreads(minWorkerThreads, Math.Max(16, minCompletionPortThreads)); int threadCount = Environment.ProcessorCount; if (args.Length > 0) { threadCount = int.Parse(args[0]); } var eventListener = new ObservableEventListener(); eventListener.LogToConsole(); eventListener.EnableEvents(BootstrapperEventSource.Log, EventLevel.Verbose); eventListener.EnableEvents(MqttIotHubAdapterEventSource.Log, EventLevel.Verbose); eventListener.EnableEvents(ChannelEventSource.Log, EventLevel.Verbose); eventListener.EnableEvents(BootstrapEventSource.Log, EventLevel.Verbose); eventListener.EnableEvents(ExecutorEventSource.Log, EventLevel.Verbose); eventListener.EnableEvents(MqttEventSource.Log, EventLevel.Verbose); try { var cts = new CancellationTokenSource(); var certificate = new X509Certificate2("protocol-gateway.contoso.com.pfx", "password"); var settingsProvider = new AppConfigSettingsProvider(); BlobSessionStatePersistenceProvider blobSessionStateProvider = BlobSessionStatePersistenceProvider.CreateAsync( settingsProvider.GetSetting("BlobSessionStatePersistenceProvider.StorageConnectionString"), settingsProvider.GetSetting("BlobSessionStatePersistenceProvider.StorageContainerName")).Result; TableQos2StatePersistenceProvider tableQos2StateProvider = TableQos2StatePersistenceProvider.CreateAsync( settingsProvider.GetSetting("TableQos2StatePersistenceProvider.StorageConnectionString"), settingsProvider.GetSetting("TableQos2StatePersistenceProvider.StorageTableName")).Result; var bootstrapper = new Bootstrapper(settingsProvider, blobSessionStateProvider, tableQos2StateProvider); Task.Run(() => bootstrapper.RunAsync(certificate, threadCount, cts.Token), cts.Token); while (true) { string input = Console.ReadLine(); if (input != null && input.ToLowerInvariant() == "exit") { break; } } cts.Cancel(); bootstrapper.CloseCompletion.Wait(TimeSpan.FromSeconds(20)); } finally { eventListener.Dispose(); } }
private static void Main() { var listener = new ObservableEventListener(); listener.LogToConsole(formatter: new TextFormatter(), colorMapper: new DefaultConsoleColorMapper()); //listener.LogToConsole(); listener.EnableEvents(PerfEventSource.Log, EventLevel.LogAlways); //listener.EnableEvents(SortEventSource.Log, EventLevel.Informational); //listener.EnableEvents(СountingSortEventSource.Log, EventLevel.Verbose); //listener.EnableEvents(QuickSortEventSource.Log, EventLevel.Verbose); //log4net.Config.XmlConfigurator.Configure(); //var summary = BenchmarkRunner.Run<СountingSortAsc>(); while (true) { for (int i = 0; i < 1; i++) { NormalExec(); } //SortingHelper.log.Info("\n-----END-----"); Console.WriteLine("Hit key to continue"); Console.Read(); } listener.Dispose(); }
public void TestExporter() { var listener = new ObservableEventListener(); listener.EnableEvents(TflEventSource.Log, EventLevel.Verbose); var subscription = listener.LogToConsole(new LegacyLogFormatter()); var file = Path.GetTempFileName(); File.WriteAllText(file, @"t1,t2,t3,t4 Monday,10,1.1,1/1/2014 Tuesday,11,2.2,2/1/2014 Wednesday,12,3.3,3/1/2014 Wednesday,12,3.3,3/1/2014 Thursday,13,4.4,4/1/2014 Friday,14,5.5,5/1/2014 Saturday,15,6.6,6/1/2014"); File.Delete(OUTPUT); var profile = new Profiler().Profile(file); new ProfileExporter().Export(profile, OUTPUT); subscription.Dispose(); listener.DisableEvents(TflEventSource.Log); listener.Dispose(); Assert.IsTrue(File.Exists(OUTPUT)); }
static void MultipleEventListenersKeywords() { var listener1 = new ObservableEventListener(); var listener2 = new ObservableEventListener(); listener1.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, MyCompanyEventSource.Keywords.Perf | MyCompanyEventSource.Keywords.Diagnostic); listener2.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, Keywords.All); // Set up and enable the event listeners - typically done when the application starts listener1.LogToConsole(); // The SinkSubscription is used later to flush the buffer var subscription = listener2.LogToSqlDatabase("Demo Semantic Logging Instance", connectionString); // Log some messages MyCompanyEventSource.Log.PageStart(23, "http://mysite/demopage"); MyCompanyEventSource.Log.Startup(); MyCompanyEventSource.Log.Failure("Couldn't connect to server."); Console.WriteLine("Written three log messages.\nUsing a basic console listener and a SQL listener to capture them."); Console.WriteLine("Only the messages with the Perf or Diagnostic keywords appears in the console, \nall three appear in the SQL Database:\n"); // Disable the event listener - typically done when the application terminates listener1.DisableEvents(MyCompanyEventSource.Log); listener2.DisableEvents(MyCompanyEventSource.Log); // Manually flush the buffer so you can see what's in the database subscription.Sink.FlushAsync().Wait(); ShowContentsOfSqlDatabaseTable(); listener1.Dispose(); listener2.Dispose(); }
static void MultipleEventListenersLevel() { // Set up and enable the event listeners - typically done when the application starts var listener1 = new ObservableEventListener(); var listener2 = new ObservableEventListener(); listener1.EnableEvents(MyCompanyEventSource.Log, EventLevel.Error, Keywords.All); listener2.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, Keywords.All); listener1.LogToConsole(); var subscription = listener2.LogToFlatFile(@"C:\Temp\DemoSemanticLogging.log", new EventTextFormatter("===================", "===================")); // Log some messages MyCompanyEventSource.Log.Startup(); MyCompanyEventSource.Log.Failure("Couldn't connect to server."); Console.WriteLine("Written two log messages.\nUsing a basic console listener and a Flat File listener to capture them."); Console.WriteLine("Only the critical message appears in the console, both appear in: \nC:\\Temp\\DemoSemanticLogging.log.\n"); // Flush the sink subscription.Sink.FlushAsync().Wait(); // Disable the event listener - typically done when the application terminates listener1.DisableEvents(MyCompanyEventSource.Log); listener2.DisableEvents(MyCompanyEventSource.Log); listener1.Dispose(); listener2.Dispose(); }
protected override void OnExit(object sender, EventArgs e) { logListener.DisableEvents(TivoProxyEventSource.Log); logListener.Dispose(); base.OnExit(sender, e); }
public async Task TestUdpEventSink() { int port = 11001; var udpclient = new UdpClient(port); var slabListener = new ObservableEventListener(); slabListener.Subscribe(new UdpEventSink(IPAddress.Loopback, port, new TestEventFormatter())); var source = TestEventSource.GetInstance(); slabListener.EnableEvents(source, EventLevel.LogAlways, Keywords.All); var t = udpclient.ReceiveAsync(); source.Message("Boris", "Meep"); var receivedText = Encoding.UTF8.GetString((await t).Buffer); Assert.Equal( "EventId=1 EventName=MessageInfo Level=Error \"FormattedMessage=Meep - Boris\" \"message=Boris\" \"caller=Meep\"\r\n", receivedText); udpclient.Close(); slabListener.Dispose(); }
public async Task TestEventSink() { var listener = new TcpListener(IPAddress.Loopback, 0); listener.Start(); int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port; var slabListener = new ObservableEventListener(); slabListener.Subscribe(new TcpEventSink(IPAddress.Loopback, port, new ExponentialBackoffTcpReconnectionPolicy(), new TestEventFormatter())); var source = TestEventSource.GetInstance(); slabListener.EnableEvents(source, EventLevel.LogAlways, Keywords.All); var listenerClient = await listener.AcceptTcpClientAsync(); source.Message("Boris", "Meep"); var receiverReader = new StreamReader(listenerClient.GetStream()); var line = await receiverReader.ReadLineAsync(); Assert.Equal( "EventId=1 EventName=MessageInfo Level=Error \"FormattedMessage=Meep - Boris\" \"message=Boris\" \"caller=Meep\"", line); listenerClient.Close(); listener.Stop(); slabListener.Dispose(); }
protected void Application_End() { if (eventListener != null) { eventListener.DisableEvents(SemanticLoggingEventSource.Log); eventListener.DisableEvents(SparkMongoEventSource.Log); eventListener.DisableEvents(SparkEngineEventSource.Log); eventListener.Dispose(); } }
static void Main(string[] args) { var listener = new ObservableEventListener(); listener.EnableEvents(TflEventSource.Log, EventLevel.Informational); var subscription = listener.LogToConsole(new LegacyLogFormatter()); ValidateArguments(args); new ProfileExporter().Export(new Profiler().Profile(_input, _sample), _output); subscription.Dispose(); listener.DisableEvents(TflEventSource.Log); listener.Dispose(); }
static async Task RunClientAsync() { var eventListener = new ObservableEventListener(); eventListener.LogToConsole(); eventListener.EnableEvents(DefaultEventSource.Log, EventLevel.Verbose); var group = new MultithreadEventLoopGroup(); X509Certificate2 cert = null; string targetHost = null; if (EchoClientSettings.IsSsl) { cert = new X509Certificate2("dotnetty.com.pfx", "password"); targetHost = cert.GetNameInfo(X509NameType.DnsName, false); } try { var bootstrap = new Bootstrap(); bootstrap .Group(group) .Channel <TcpSocketChannel>() .Option(ChannelOption.TcpNodelay, true) .Handler(new ActionChannelInitializer <ISocketChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; if (cert != null) { pipeline.AddLast(new TlsHandler(stream => new SslStream(stream, true, (sender, certificate, chain, errors) => true), new ClientTlsSettings(targetHost))); } pipeline.AddLast(new LengthFieldPrepender(2)); pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast(new EchoClientHandler()); })); IChannel bootstrapChannel = await bootstrap.ConnectAsync(new IPEndPoint(EchoClientSettings.Host, EchoClientSettings.Port)); Console.ReadLine(); await bootstrapChannel.CloseAsync(); } finally { group.ShutdownGracefullyAsync().Wait(1000); eventListener.Dispose(); } }
static void Main(string[] args) { ObservableEventListener listener = new ObservableEventListener(); listener.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, Keywords.All); listener.LogToConsole(); // Modify these settings to match your SMTP service requirements. listener.LogToEmail("smtp.live.com", 587, "*****@*****.**", "In Proc Sample", "etw"); MyCompanyEventSource.Log.Failure("No response from servers, general network failure!!"); listener.DisableEvents(MyCompanyEventSource.Log); listener.Dispose(); }
static async Task RunClientAsync() { var eventListener = new ObservableEventListener(); eventListener.LogToConsole(); eventListener.EnableEvents(DefaultEventSource.Log, EventLevel.Verbose); var group = new MultithreadEventLoopGroup(); X509Certificate2 cert = null; string targetHost = null; if (EchoClientSettings.IsSsl) { cert = new X509Certificate2("dotnetty.com.pfx", "password"); targetHost = cert.GetNameInfo(X509NameType.DnsName, false); } try { var bootstrap = new Bootstrap(); bootstrap .Group(group) .Channel<TcpSocketChannel>() .Option(ChannelOption.TcpNodelay, true) .Handler(new ActionChannelInitializer<ISocketChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; if (cert != null) { pipeline.AddLast(new TlsHandler(stream => new SslStream(stream, true, (sender, certificate, chain, errors) => true), new ClientTlsSettings(targetHost))); } pipeline.AddLast(new LengthFieldPrepender(2)); pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast(new EchoClientHandler()); })); IChannel bootstrapChannel = await bootstrap.ConnectAsync(new IPEndPoint(EchoClientSettings.Host, EchoClientSettings.Port)); Console.ReadLine(); await bootstrapChannel.CloseAsync(); } finally { group.ShutdownGracefullyAsync().Wait(1000); eventListener.Dispose(); } }
static async Task RunServerAsync() { var eventListener = new ObservableEventListener(); eventListener.LogToConsole(); eventListener.EnableEvents(DefaultEventSource.Log, EventLevel.Verbose); var bossGroup = new MultithreadEventLoopGroup(1); var workerGroup = new MultithreadEventLoopGroup(); X509Certificate2 tlsCertificate = null; if (EchoServerSettings.IsSsl) { tlsCertificate = new X509Certificate2("dotnetty.com.pfx", "password"); } try { var bootstrap = new ServerBootstrap(); bootstrap .Group(bossGroup, workerGroup) .Channel <TcpServerSocketChannel>() .Option(ChannelOption.SoBacklog, 100) .Handler(new LoggingHandler(LogLevel.INFO)) .ChildHandler(new ActionChannelInitializer <ISocketChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; if (tlsCertificate != null) { pipeline.AddLast(TlsHandler.Server(tlsCertificate)); } pipeline.AddLast(new LengthFieldPrepender(2)); pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast(new EchoServerHandler()); })); IChannel bootstrapChannel = await bootstrap.BindAsync(EchoServerSettings.Port); Console.ReadLine(); await bootstrapChannel.CloseAsync(); } finally { Task.WaitAll(bossGroup.ShutdownGracefullyAsync(), workerGroup.ShutdownGracefullyAsync()); eventListener.Dispose(); } }
static void SimpleEventSourceWithXMLFormatter() { // Set up and enable the event listener - typically done when the application starts var listener = new ObservableEventListener(); listener.LogToConsole(new XmlEventTextFormatter(EventTextFormatting.Indented)); listener.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, Keywords.All); // Log some messages MyCompanyEventSource.Log.Startup(); MyCompanyEventSource.Log.Failure("Couldn't connect to server."); Console.WriteLine("Written two log messages.\nUsing a console listener with an XML formatter to capture them."); // Disable the event listener - typically done when the application terminates listener.DisableEvents(MyCompanyEventSource.Log); listener.Dispose(); }
static void EmailEventSource() { ObservableEventListener listener = new ObservableEventListener(); listener.EnableEvents(TrackREEvents.Log, EventLevel.LogAlways, Keywords.All); listener.LogToEmail(CredentialManager.smtp, CredentialManager.port, "*****@*****.**", "TrackRE: App Initialization", "etw"); // Log some messages //TrackREEvents.Log.Startup(); TrackREEvents.Log.Failure("Message sent from Global.asax"); // Disable the event listener - typically done when the application terminates listener.DisableEvents(TrackREEvents.Log); listener.Dispose(); }
public static void CITTLogToEmail(string errsubject, string errmessage) { ObservableEventListener listener = new ObservableEventListener(); listener.EnableEvents(TrackREEvents.Log, EventLevel.LogAlways, Keywords.All); //listener.LogToEmail("smtp.live.com", 587, "*****@*****.**", "In Proc Sample", "etw"); listener.LogToEmail(CredentialManager.smtp, CredentialManager.port, "*****@*****.**", errsubject, "etw"); // Log some messages TrackREEvents.Log.Failure(errmessage); // Disable the event listener - typically done when the application terminates listener.DisableEvents(TrackREEvents.Log); listener.Dispose(); }
static async Task RunServerAsync() { var eventListener = new ObservableEventListener(); eventListener.LogToConsole(); eventListener.EnableEvents(DefaultEventSource.Log, EventLevel.Verbose); var bossGroup = new MultithreadEventLoopGroup(1); var workerGroup = new MultithreadEventLoopGroup(); X509Certificate2 tlsCertificate = null; if (EchoServerSettings.IsSsl) { tlsCertificate = new X509Certificate2("dotnetty.com.pfx", "password"); } try { var bootstrap = new ServerBootstrap(); bootstrap .Group(bossGroup, workerGroup) .Channel<TcpServerSocketChannel>() .Option(ChannelOption.SoBacklog, 100) .Handler(new LoggingHandler(LogLevel.INFO)) .ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; if (tlsCertificate != null) { pipeline.AddLast(TlsHandler.Server(tlsCertificate)); } pipeline.AddLast(new LengthFieldPrepender(2)); pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast(new EchoServerHandler()); })); IChannel bootstrapChannel = await bootstrap.BindAsync(EchoServerSettings.Port); Console.ReadLine(); await bootstrapChannel.CloseAsync(); } finally { Task.WaitAll(bossGroup.ShutdownGracefullyAsync(), workerGroup.ShutdownGracefullyAsync()); eventListener.Dispose(); } }
static void SimpleEventSourceWithColorMapper() { // Set up and enable the event listener - typically done when the application starts var listener = new ObservableEventListener(); listener.LogToConsole(new JsonEventTextFormatter(EventTextFormatting.Indented), new MyCustomColorMapper()); listener.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, Keywords.All); // Log some messages MyCompanyEventSource.Log.Startup(); MyCompanyEventSource.Log.PageStop(99); Console.WriteLine("Written two log messages.\nUsing a console listener with a JSON formatter to capture them."); // Disable the event listener - typically done when the application terminates listener.DisableEvents(MyCompanyEventSource.Log); listener.Dispose(); }
static void SimpleEventSource() { // Set up and enable the event listener - typically done when the application starts var listener = new ObservableEventListener(); listener.LogToConsole(); listener.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, Keywords.All); // Log some messages MyCompanyEventSource.Log.Startup(); MyCompanyEventSource.Log.Failure("Couldn't connect to server."); Console.WriteLine("Written two log messages.\nUsing a basic console listener to capture them."); Console.WriteLine("The color is determined by the severity level.\n"); // Disable the event listener - typically done when the application terminates listener.DisableEvents(MyCompanyEventSource.Log); listener.Dispose(); }
public void WhenListenerIsDisposed() { this.tableName = "WhenListenerIsDisposed"; var connectionString = System.Configuration.ConfigurationManager.AppSettings["StorageConnectionString"]; AzureTableHelper.DeleteTable(connectionString, this.tableName); var logger = TestEventSource.Logger; var listener1 = new ObservableEventListener(); var listener2 = new ObservableEventListener(); try { listener1.LogToWindowsAzureTable("mytestinstance1", connectionString, this.tableName, bufferingInterval: TimeSpan.FromSeconds(20)); listener2.LogToWindowsAzureTable("mytestinstance2", connectionString, this.tableName, bufferingInterval: TimeSpan.FromSeconds(20)); listener1.EnableEvents(logger, EventLevel.LogAlways); listener2.EnableEvents(logger, EventLevel.LogAlways); var logTaskList = new List <Task>(); for (int i = 0; i < 105; i++) { var messageNumber = i; logTaskList.Add(Task.Run(() => logger.Critical(messageNumber + "Critical message"))); } Task.WaitAll(logTaskList.ToArray(), TimeSpan.FromSeconds(10)); listener1.Dispose(); listener2.Dispose(); var events = AzureTableHelper.PollForEvents(connectionString, this.tableName, 600); Assert.AreEqual(210, events.Count()); } finally { try { listener1.DisableEvents(logger); } catch { } try { listener2.DisableEvents(logger); } catch { } } }
static void UsingRxFiltering() { // Configure the observable listener. var listener = new ObservableEventListener(); listener.EnableEvents(MyCompanyEventSource.Log, EventLevel.LogAlways, Keywords.All); // Use the custom filter extension method (see the ObservableHelper class). // If an message of level Error is received, send it and the two previous // information messages to the console. listener .FlushOnTrigger(entry => entry.Schema.Level <= EventLevel.Error, bufferSize: 2) .LogToConsole(); Console.WriteLine("Sending 20 informational messages and one error message."); for (int i = 0; i < 20; i++) { MyCompanyEventSource.Log.DBQueryStart("select... (query #" + i); } MyCompanyEventSource.Log.DBQueryError(231); Console.WriteLine("Only the last two information messages and the error message get sent to the console sink."); listener.Dispose(); }
static void Main(string[] args) { var listener = new ObservableEventListener(); listener.EnableEvents(RxFloodQuickStartEventSource.Log, EventLevel.LogAlways, Keywords.All); // ThrottleEventsWithEventId is a custom extension method that shows how you can leverage the power of Reactive Extensions (Rx) // to perform filtering (or transformation) of the event stream before it is sent to the underlying sink. // In this case, ThrottleEventsWithEventId will throttle entries with EventID=4 and mute additional occurrences for 15 seconds. // This prevents a particular event from flooding the log sink, making it difficult to diagnose other issues. // This can be useful in the case that a high-throughput event does not have a keyword or verbosity setting that makes it easy // to exclude it in the call to listener.EnableEvents(EventSource, EventLevel, EventKeywords). // Note: For basic scenarios without this extra filtering, you DO NOT need to use Rx, and SLAB does not depend on it. var subscription = listener .ThrottleEventsWithEventId(TimeSpan.FromSeconds(15), ThrottledEventId) .LogToConsole(SingleLineFormatter); // The previous custom extension method (ThrottleEventsWithEventId) is all that is needed to call to throttle // an event that is flooding the log. // The rest of the code in this QuickStart is here to show an interactive demo of how it looks if this filter is turned on or off. bool currentlyThrottling = true; var cts = new CancellationTokenSource(); Console.WriteLine("This program simulates the scenario of a particular event being logged multiple times in succession when a certain condition occurs,"); Console.WriteLine("such as when there is a transient or expected connectivity error during system upgrades."); Console.WriteLine(); Console.WriteLine("While the application is logging messages, use the following commands:"); Console.WriteLine(" [ESC] Exists the application."); Console.WriteLine(" [Spacebar] Toggles the throttling filter."); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Press any key to start doing background work."); var key = Console.ReadKey(false); if (key.Key == ConsoleKey.Escape) { return; } DoBackgroundWork(cts.Token); while (!cts.IsCancellationRequested) { key = Console.ReadKey(false); switch (key.Key) { case ConsoleKey.Spacebar: subscription.Dispose(); if (currentlyThrottling) { Console.WriteLine("Filter toggled: event entries will not be throttled. In this scenario, if there is no post-filtering of events, important messages could go unnoticed."); Thread.Sleep(TimeSpan.FromSeconds(3)); currentlyThrottling = false; // Note that the events are sent directly to the console, without using Reactive Extensions. subscription = listener .LogToConsole(SingleLineFormatter); } else { Console.WriteLine("Filter toggled: event entries with ID {0} will be throttled for 15 seconds to prevent that type of entry to flood the log.", ThrottledEventId); Thread.Sleep(TimeSpan.FromSeconds(3)); currentlyThrottling = true; // Note that the events are filtered first and then sent to the console, using Reactive Extensions. subscription = listener .ThrottleEventsWithEventId(TimeSpan.FromSeconds(15), ThrottledEventId) .LogToConsole(SingleLineFormatter); } break; case ConsoleKey.Escape: cts.Cancel(); break; } } listener.Dispose(); }
//[Ignore("Depends on NorthWind database on local SQL Server.")] public void TestProfileAndExportDatabaseTable() { var listener = new ObservableEventListener(); listener.EnableEvents(TflEventSource.Log, EventLevel.Verbose); var subscription = listener.LogToConsole(new LegacyLogFormatter()); var result = new Profiler().Profile("localhost.NorthWind.dbo.Customers"); new ProfileExporter().Export(result); subscription.Dispose(); listener.DisableEvents(TflEventSource.Log); listener.Dispose(); Assert.NotNull(result); }
protected override void OnExit(ExitEventArgs e) { base.OnExit(e); listener.Dispose(); }
public void Dispose() { _listener.DisableEvents(_eventSource); _listener.Dispose(); GC.SuppressFinalize(this); }