Изменение управления потокобезопасным способом - PullRequest
0 голосов
/ 17 марта 2011

Я пытаюсь использовать поточно-ориентированные вызовы элементов управления пользовательского интерфейса из формы C #.По какой-то причине BackgroundWorkerHelper недоступен, возможно, это связано с версией C # или из-за того, что я выполняю развертывание на «устройстве Window CE 5.0».

У меня есть

    //For ThreadSafe called to edit components
    private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue);
    public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue)
    {
        if (control.InvokeRequired)
        {
            control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object[] { control, propertyName, propertyValue });
        }
        else
        {
            control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue });
        }

    }

И вызываю поток как этот

private Thread workerThread = new Thread(new ThreadStart(this.remoteRequestBackgroundTask));

workerThread.Start();

Затем внутри функции remoteRequestBackgroundTask () я меняю элементы управления следующим образом:

        //enable the cancel button
        SetControlPropertyThreadSafe(btnCancel, "Enabled", true);

Проблема в том, что когда он запускается,отладка останавливается здесь

control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue });

, и я получаю "NotSupportedException"

1 Ответ

2 голосов
/ 17 марта 2011

Посмотрите документацию MSDN для .InvokeMember , в разделе Исключения . Рядом с NotSupportedException вы увидите:

.NET Compact Framework в настоящее время не поддерживает этот метод.

В этом else блоке, я думаю, вы могли бы сделать что-то подобное вместо этого. Это сокращено от некоторого очень похожего кода .NET Compact Framework, который у меня есть:

PropertyInfo propertyInfo = control.GetType().GetProperty(propertyName);
propertyInfo.SetValue(control, propertyValue, null);
...