所以我从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 });
?
答案 0 :(得分:0)
1)“调用”不会使您的代码线程安全。您可能会将此与从UI线程以外的线程访问.NET的UI控件的问题混淆。
2)在控制台应用程序的UI意义上有“控制”的意义是什么?另一种方法是简单地调用方法。
如果您想要异步执行此操作,那么最简单的方法是使用TPL。
答案 1 :(得分:0)
Control.Invoke
。基本上,它在您的示例中是同步的。
因此,只需直接调用委托,或者如果您需要它进行线程化:
Task.Factory.StartNew(() => ..call delegate here ..);