Skip to content

Commit

Permalink
wmi is too slow to be usable
Browse files Browse the repository at this point in the history
  • Loading branch information
tewarid committed Aug 19, 2020
1 parent ae068ac commit 42645e2
Showing 1 changed file with 3 additions and 62 deletions.
65 changes: 3 additions & 62 deletions SerialTool/MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using System;
using System.IO;
using System.IO.Ports;
using System.Management;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
Expand All @@ -13,49 +12,10 @@ namespace SerialTool
public partial class MainForm : Form
{
private SerialPort port;
private ManagementEventWatcher portCreationWatcher;
private ManagementEventWatcher portDeletionWatcher;

public MainForm()
{
InitializeComponent();

Task.Run(() =>
{
string query = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance isa \"WIN32_SerialPort\"";
portCreationWatcher = new ManagementEventWatcher(query);
portCreationWatcher.EventArrived += Watcher_SerialPortCreation;
portCreationWatcher.Start();
query = "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance isa \"WIN32_SerialPort\"";
portDeletionWatcher = new ManagementEventWatcher(query);
portDeletionWatcher.EventArrived += Watcher_SerialPortDeletion;
portDeletionWatcher.Start();
});
}

private void Watcher_SerialPortCreation(object sender, EventArrivedEventArgs e)
{
BeginInvoke((MethodInvoker)delegate
{
ManagementBaseObject target = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
serialPortName.Items.Add(target.Properties["DeviceId"].Value.ToString());
});
}

private void Watcher_SerialPortDeletion(object sender, EventArrivedEventArgs e)
{
BeginInvoke((MethodInvoker)delegate
{
ManagementBaseObject target = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
string portName = target.Properties["DeviceId"].Value.ToString();
if (serialPortName.Text.Equals(portName))
{
serialPortName.Text = string.Empty;
CloseSerialPort();
}
serialPortName.Items.Remove(portName);
});
}

private void ShowSerialPorts()
Expand Down Expand Up @@ -263,28 +223,9 @@ private void TimeOut_CheckedChanged(object sender, EventArgs e)

private async void SerialPortName_SelectedIndexChanged(object sender, EventArgs e)
{
string description = string.Empty;
string pnpDeviceID = string.Empty;
string portName = serialPortName.Text;
await Task.Run(() =>
{
string query = $"SELECT * FROM WIN32_SerialPort WHERE DeviceID=\"{portName}\"";
using (var searcher = new ManagementObjectSearcher(query))
{
var ports = searcher.Get();
foreach (var port in ports)
{
description = port.Properties["Description"].Value.ToString();
pnpDeviceID = port.Properties["PNPDeviceID"].Value.ToString();
break;
}
}
});
outputText.AppendText($"{description}");
outputText.AppendText($"{Environment.NewLine}");
outputText.AppendText($"{pnpDeviceID}");
outputText.AppendText($"{Environment.NewLine}");
await Task.CompletedTask;
outputText.AppendText($"{serialPortName.Text} selected.");
outputText.AppendText($"{Environment.NewLine}");
}
}
}
}

0 comments on commit 42645e2

Please sign in to comment.