1

所以我从一个通过该control.invoke方法调用委托的 GUI 程序中获得了一些代码,现在我想在控制台中执行此操作。

这是代码:

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 });

4

2 回答 2

0

1)“调用”不会使您的代码线程安全。您可能将此与从 UI 线程以外的线程访问 .NET 的 UI 控件的问题混淆了。

2) 在控制台应用程序中,在 UI 意义上拥有“控件”是什么意思?另一种方法是简单地调用该方法。

如果您寻求异步执行此操作,那么最简单的方法是使用TPL

于 2013-08-13T23:40:52.207 回答
0

Control.Invoke在 UI 线程(拥有控件的线程)上调用。本质上,它在您的示例中是同步的。

因此,只需直接调用委托,或者如果您需要线程化:

Task.Factory.StartNew(() => ..call delegate here ..);
于 2013-08-13T23:41:34.367 回答