Использование OpenNETCF.Net.Ftp внутри пользовательского класса, а не внутри формы Windows - PullRequest
0 голосов
/ 22 мая 2009

Точная копия Использование OpenNETCF.Net.Ftp внутри класса вместо формы Windows


Пока что я использую объект FTP внутри формы Windows. FTP-объект работает в отдельном потоке, поэтому, чтобы мое приложение не зависало, я использую следующий фрагмент кода:

private void OnResponse(string response)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new StringDelegate(OnResponse), new object[] { response });
            return;
        }
    } //end of OnResponse

Мне не совсем ясно, что такое делегат строки, но это работает.

Однако я сейчас занимаюсь рефакторингом и хочу спрятать ftp в класс. Мой вопрос: как мне убедиться, что основной поток не зависает? Все ссылки в Интернете, касающиеся создания событий внутри классов, имеют смысл, но я не нашел ни одного примера, где приложение является многопоточным. Моя самая большая проблема была бы InvokeRequired.

В приведенном выше коде «Это» является формой. Если я скрываю объект ftp внутри класса, такого как следующий:

abstract class MyClass
{
    //data members
    private FTP _ftp;

    //other data members, methods, and properties etc
}

«Это» становится объектом MyClass. Я не уверен, реализовано ли свойство InvokeRequired в классе (возможно, я должен заставить его реализовать специальный интерфейс, который имеет это свойство?). Или, может быть, я что-то упускаю и не должен использовать многопоточные объекты внутри классов?

Я использую c # и asp.net 2.0 с VS 2008.

1 Ответ

1 голос
/ 23 мая 2009

InvokeRequired и Invoke необходимо использовать только на уровне пользовательского интерфейса, чтобы гарантировать, что вы не будете взаимодействовать со своими элементами управления в потоке, не являющемся пользовательским интерфейсом. Если MyClass не является компонентом пользовательского интерфейса, вам не о чем беспокоиться.

Вам МОЖЕТ беспокоиться, когда MyClass взаимодействует с пользовательским интерфейсом. Например, если MyClass собирается вызвать событие в результате OnResponse, и пользовательский интерфейс будет наблюдать это событие, то в обработчике событий в пользовательском интерфейсе вам нужно будет использовать InvokeRequired и Invoke.

...