public void Dispose() {
if (IsDisposed) {
return;
}
Tracer.Browse -= Tracer_Browse;
Session.AfterRequest -= Session_AfterRequest;
Session.Disconnected -= Session_Disconnected;
var sessionProvider = WorkflowProvider.GetOrCreate().RSessions;
sessionProvider.BrokerChanged -= SessionProvider_BrokerChanged;
_events = null;
_program = null;
MainThread.Dispose();
MainThread = null;
Tracer = null;
ExitBrowserAsync(Session).DoNotWait();
Session = null;
IsDisposed = true;
}