diff --git a/OpenMetaverse/NetworkManager.cs b/OpenMetaverse/NetworkManager.cs
index 5654c73..f294fcb 100644
--- a/OpenMetaverse/NetworkManager.cs
+++ b/OpenMetaverse/NetworkManager.cs
@@ -646,6 +646,39 @@ namespace OpenMetaverse
}
}
+ ///
+ /// Begins the non-blocking logout. Makes sure that the LoggedOut event is
+ /// called even if the server does not send a logout reply, and Shutdown()
+ /// is properly called.
+ ///
+ public void BeginLogout()
+ {
+ // Wait for a logout response (by way of the LoggedOut event. If the
+ // response is received, shutdown will be fired in the callback.
+ // Otherwise we fire it manually with a NetworkTimeout type after LOGOUT_TIMEOUT
+ System.Timers.Timer timeout = new System.Timers.Timer();
+
+ EventHandler callback = delegate(object sender, LoggedOutEventArgs e) {
+ Shutdown(DisconnectType.ClientInitiated);
+ timeout.Stop();
+ };
+
+ LoggedOut += callback;
+
+ timeout.Interval = Client.Settings.LOGOUT_TIMEOUT;
+ timeout.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e) {
+ timeout.Stop();
+ Shutdown(DisconnectType.NetworkTimeout);
+ OnLoggedOut(new LoggedOutEventArgs(new List()));
+ };
+ timeout.Start();
+
+ // Send the packet requesting a clean logout
+ RequestLogout();
+
+ LoggedOut -= callback;
+ }
+
///
/// Initiate a blocking logout request. This will return when the logout
/// handshake has completed or when Settings.LOGOUT_TIMEOUT