Итак, у меня есть код из GUI-программы, который вызывает делегата через метод control.invoke
, и теперь я хочу сделать это в консоли.Вызовите без контроля?
Это код:
public class upnpforwarder
{
List<INatDevice> devices = new List<INatDevice>();
public upnpforwarder()
{
//Hook into the events so you know when a router has been detected or has gone offline
NatUtility.DeviceFound += DeviceFound;
//Start searching for upnp enabled routers
NatUtility.StartDiscovery();
}
delegate void AddDeviceDelegate(INatDevice device);
delegate void RemoveDeviceDelegate(INatDevice device);
// Adding devices to the list and listbox
private void AddDevice(INatDevice device)
{
if (!devices.Contains(device))
{
devices.Add(device);
IPAddress external = device.GetExternalIP();
Mapping[] maps = device.GetAllMappings();
//complicated stuff because the library only allows to display some data via .ToString() as far as I know
string str = device.ToString();
}
}
// Event that handles a new found device
private void DeviceFound(object sender, DeviceEventArgs args)
{
//Make it thread-safe
AddDeviceDelegate AddDeviceInstance = new AddDeviceDelegate(this.AddDevice);
this.Invoke(AddDeviceInstance, new object[] { args.Device });
}
Каков наилучший альтернативный метод: this.Invoke(AddDeviceInstance, new object[] { args.Device });
?
Invoke используется, чтобы убедиться, вызов происходит в потоке пользовательского интерфейса (а не фоновый поток). Если у вас нет пользовательского интерфейса, вам не нужно ничего перемещать в поток пользовательского интерфейса. Просто вызовите метод. –
Использование control.Invoke применимо только в многопоточной ситуации. Обычно, когда есть один поток пользовательского интерфейса и один или несколько рабочих потоков. У вас несколько потоков в консольной версии программы? – RenniePet