1

そのため、メソッドを介してデリゲートを呼び出す 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 });ですか?

4

2 に答える 2

0

1)「呼び出し」はコードをスレッドセーフにしません。これを、UI スレッド以外のスレッドから .NET の UI コントロールにアクセスする問題と混同した可能性があります。

2) コンソール アプリケーションに UI の意味で「コントロール」があるとはどういう意味ですか? 別の方法は、単にメソッドを呼び出すことです。

これを非同期で行う場合、最も簡単な方法はTPLを使用することです。

于 2013-08-13T23:40:52.207 に答える
0

Control.InvokeUI スレッド (コントロールを所有するスレッド) で呼び出されます。基本的に、あなたの例では同期しています。

したがって、デリゲートを直接呼び出すか、スレッド化する必要がある場合は次のようにします。

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