Run Join/Leave commands asynchronously so the UI doesn't lock up on thoise commands

This commit is contained in:
Grant Limberg 2017-05-08 16:17:03 -07:00
parent b3dd5c0e3a
commit 73f7088b45
4 changed files with 112 additions and 90 deletions

View file

@ -8,6 +8,7 @@ using System.IO;
using System.Windows; using System.Windows;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Diagnostics; using System.Diagnostics;
using System.Windows.Threading;
namespace WinUI namespace WinUI
{ {
@ -264,7 +265,9 @@ namespace WinUI
} }
} }
public void JoinNetwork(string nwid, bool allowManaged = true, bool allowGlobal = false, bool allowDefault = false) public void JoinNetwork(Dispatcher d, string nwid, bool allowManaged = true, bool allowGlobal = false, bool allowDefault = false)
{
Task.Factory.StartNew(() =>
{ {
var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest; var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest;
if (request == null) if (request == null)
@ -274,7 +277,7 @@ namespace WinUI
request.Method = "POST"; request.Method = "POST";
request.ContentType = "applicaiton/json"; request.ContentType = "applicaiton/json";
request.Timeout = 10000; request.Timeout = 30000;
try try
{ {
using (var streamWriter = new StreamWriter(((HttpWebRequest)request).GetRequestStream())) using (var streamWriter = new StreamWriter(((HttpWebRequest)request).GetRequestStream()))
@ -288,8 +291,11 @@ namespace WinUI
} }
} }
catch (System.Net.WebException) catch (System.Net.WebException)
{
d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{ {
MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service."); MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
}));
return; return;
} }
@ -307,8 +313,11 @@ namespace WinUI
} }
} }
catch (System.Net.Sockets.SocketException) catch (System.Net.Sockets.SocketException)
{
d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{ {
MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service."); MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
}));
} }
catch (System.Net.WebException e) catch (System.Net.WebException e)
{ {
@ -317,11 +326,17 @@ namespace WinUI
{ {
APIHandler.initHandler(true); APIHandler.initHandler(true);
} }
d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service."); MessageBox.Show("Error Joining Network: Cannot connect to ZeroTier service.");
}));
} }
});
} }
public void LeaveNetwork(string nwid) public void LeaveNetwork(Dispatcher d, string nwid)
{
Task.Factory.StartNew(() =>
{ {
var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest; var request = WebRequest.Create(url + "/network/" + nwid + "?auth=" + authtoken) as HttpWebRequest;
if (request == null) if (request == null)
@ -330,7 +345,7 @@ namespace WinUI
} }
request.Method = "DELETE"; request.Method = "DELETE";
request.Timeout = 10000; request.Timeout = 30000;
try try
{ {
@ -346,8 +361,11 @@ namespace WinUI
} }
} }
catch (System.Net.Sockets.SocketException) catch (System.Net.Sockets.SocketException)
{
d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{ {
MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service."); MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
}));
} }
catch (System.Net.WebException e) catch (System.Net.WebException e)
{ {
@ -356,12 +374,16 @@ namespace WinUI
{ {
APIHandler.initHandler(true); APIHandler.initHandler(true);
} }
d.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
{
MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service."); MessageBox.Show("Error Leaving Network: Cannot connect to ZeroTier service.");
}));
} }
catch catch
{ {
Console.WriteLine("Error leaving network: Unknown error"); Console.WriteLine("Error leaving network: Unknown error");
} }
});
} }
public delegate void PeersCallback(List<ZeroTierPeer> peers); public delegate void PeersCallback(List<ZeroTierPeer> peers);

View file

@ -118,7 +118,7 @@ namespace WinUI
bool allowGlobal = allowGlobalCheckbox.IsChecked.Value; bool allowGlobal = allowGlobalCheckbox.IsChecked.Value;
bool allowManaged = allowManagedCheckbox.IsChecked.Value; bool allowManaged = allowManagedCheckbox.IsChecked.Value;
APIHandler.Instance.JoinNetwork(joinNetworkBox.Text, allowManaged, allowGlobal, allowDefault); APIHandler.Instance.JoinNetwork(this.Dispatcher, joinNetworkBox.Text, allowManaged, allowGlobal, allowDefault);
Close(); Close();
} }

View file

@ -106,14 +106,14 @@ namespace WinUI
private void deleteButton_Click(object sender, RoutedEventArgs e) private void deleteButton_Click(object sender, RoutedEventArgs e)
{ {
APIHandler.Instance.LeaveNetwork(network.NetworkId); APIHandler.Instance.LeaveNetwork(this.Dispatcher, network.NetworkId);
NetworkMonitor.Instance.RemoveNetwork(network.NetworkId); NetworkMonitor.Instance.RemoveNetwork(network.NetworkId);
} }
private void AllowManaged_CheckStateChanged(object sender, RoutedEventArgs e) private void AllowManaged_CheckStateChanged(object sender, RoutedEventArgs e)
{ {
CheckBox cb = sender as CheckBox; CheckBox cb = sender as CheckBox;
APIHandler.Instance.JoinNetwork(network.NetworkId, APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId,
allowManaged.IsChecked ?? false, allowManaged.IsChecked ?? false,
allowGlobal.IsChecked ?? false, allowGlobal.IsChecked ?? false,
allowDefault.IsChecked ?? false); allowDefault.IsChecked ?? false);
@ -122,7 +122,7 @@ namespace WinUI
private void AllowGlobal_CheckStateChanged(object sender, RoutedEventArgs e) private void AllowGlobal_CheckStateChanged(object sender, RoutedEventArgs e)
{ {
CheckBox cb = sender as CheckBox; CheckBox cb = sender as CheckBox;
APIHandler.Instance.JoinNetwork(network.NetworkId, APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId,
allowManaged.IsChecked ?? false, allowManaged.IsChecked ?? false,
allowGlobal.IsChecked ?? false, allowGlobal.IsChecked ?? false,
allowDefault.IsChecked ?? false); allowDefault.IsChecked ?? false);
@ -131,7 +131,7 @@ namespace WinUI
private void AllowDefault_CheckStateChanged(object sender, RoutedEventArgs e) private void AllowDefault_CheckStateChanged(object sender, RoutedEventArgs e)
{ {
CheckBox cb = sender as CheckBox; CheckBox cb = sender as CheckBox;
APIHandler.Instance.JoinNetwork(network.NetworkId, APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId,
allowManaged.IsChecked ?? false, allowManaged.IsChecked ?? false,
allowGlobal.IsChecked ?? false, allowGlobal.IsChecked ?? false,
allowDefault.IsChecked ?? false); allowDefault.IsChecked ?? false);
@ -155,11 +155,11 @@ namespace WinUI
bool managed = allowManaged.IsChecked.Value; bool managed = allowManaged.IsChecked.Value;
bool defRoute = allowDefault.IsChecked.Value; bool defRoute = allowDefault.IsChecked.Value;
APIHandler.Instance.JoinNetwork(networkId.Text, managed, global, defRoute); APIHandler.Instance.JoinNetwork(this.Dispatcher, networkId.Text, managed, global, defRoute);
} }
else else
{ {
APIHandler.Instance.LeaveNetwork(networkId.Text); APIHandler.Instance.LeaveNetwork(this.Dispatcher, networkId.Text);
} }
} }
} }

View file

@ -269,11 +269,11 @@ namespace WinUI
ZeroTierNetwork network = item.DataContext as ZeroTierNetwork; ZeroTierNetwork network = item.DataContext as ZeroTierNetwork;
if (item.IsChecked) if (item.IsChecked)
{ {
APIHandler.Instance.LeaveNetwork(network.NetworkId); APIHandler.Instance.LeaveNetwork(this.Dispatcher, network.NetworkId);
} }
else else
{ {
APIHandler.Instance.JoinNetwork(network.NetworkId, network.AllowManaged, network.AllowGlobal, network.AllowDefault); APIHandler.Instance.JoinNetwork(this.Dispatcher, network.NetworkId, network.AllowManaged, network.AllowGlobal, network.AllowDefault);
} }
} }
} }