где лучшее место состоит в том, чтобы сделать работу инициализации в winform?

В событии Load или в конструкторе после InitializeComponent ()?

или не имеет значения вообще?

7
задан Benny 15 January 2010 в 03:02
поделиться

6 ответов

Форма Событие - это хорошее место для выполнения любой инициализации, которая может занять более чем примерно одну секунду. Форма. Оказаться только один раз, только после Форма сначала сделана видимой для пользователя.

Очевидно, что если у вас есть длительная инициализация, вам все еще нужно предоставить какую-то визуальную обратную связь и, возможно, отключить разделы формы до завершения. Но если инициализация неизбежна, форма. Shown, по крайней мере, позволяет сообщить пользователю, что приложение не заморожено и дает обратную связь о том, что он на самом деле делает.

По сравнению с Form.load: от пользователей Перспектива Ваша заявка будет восприниматься для начала быстро, потому что ваша форма уже видна, когда инициализация выполняется.

По сравнению с формой. Активируются: вам не нужно беспокоиться о вашей инициализации, работающих несколько раз, потому что активированное событие вызывается каждый раз, когда ваша форма скрыта / показана, минимизирована / максимально и т. Д.

по сравнению с конструктором: Подобно форме. Загрузить вашу форму не будет отображена до завершения инициализации. Кроме того, вы должны быть более осторожны о проблемах сроков / последовательности, связанных с элементами управления, которые не могут быть полностью инициализированы.

5
ответ дан 6 December 2019 в 14:04
поделиться

Ранее вы делали что-то подобное

$('#foo').animate({opacity: 1},1000).fadeOut('slow');

Первый аниматор ничего не делает, так как у вас уже есть непрозрачность 1 на элементе, но он приостановится на некоторое время.

В jQuery 1.4 они встроили это в рамку, чтобы вам не пришлось использовать взлом, как описано выше.

$('#foo').delay(1000).fadeOut('slow');

Функциональные возможности аналогичны функциям исходного плагина jQuery.delay () http://www.evanbot.com/article/jquery-delay-plugin/4

-121--1069587-

Для более тяжелой инициализации обычно выполняется в событии загрузки. Конструкторы обычно используются для быстрой, простой инициализации полей. Если необходимо выполнить вызов метода, например, для внешней зависимости, необходимо выполнить его из загрузки.

-121--3879877-

Это зависит от типа инициализации. Например, простая инициализация поля может быть выполнена в конструкторе, что избавляет вас от необходимости подключать событие, иметь дополнительный метод и т.д.

Однако в некоторых случаях конструктор не имеет нужной информации. Например, если требуется выполнять различные действия в зависимости от режима разработки или запуска. (например, в режиме выполнения вы будете подключаться к источнику данных, но в режиме разработки вы хотите отобразить образцы данных), то это должно быть отложено до завершения конструирования, поскольку рамка не устанавливает Режим проектирования до создания объекта.

2
ответ дан 6 December 2019 в 14:04
поделиться

Я вижу только два преимущества для небольших сайтов быть: 6) RESTful urls, который позволяет SEO. 7) Отсутствие событий ViewState и PostBack (и повышение производительности в целом)

Тестирование для небольших сайтов не является проблемой, равно как и преимущества проектирования, когда сайт в любом случае закодирован правильно, MVC во многом запутывает и затрудняет внесение изменений. Я все еще решаю, стоят ли эти преимущества.

Я ясно вижу преимущество MVC на более крупных сайтах с несколькими разработчиками.

-121--653050-

Я не знаю, почему WCF игнорирует StartRoot, поэтому я не могу ответить на эту часть вашего вопроса. Но у меня есть несколько способов решить проблему.

  1. сначала начинается с WSDL.
    Если имеется определенный набор пространств имен XML, которые необходимо применить к отправляемым и получаемым сообщениям, используйте WSDL и XML Schema, чтобы явно указать их.

    Затем создайте код-заглушку на стороне сервера или код прокси на стороне клиента непосредственно из этого WSDL с помощью средства svcutil.exe .

  2. использовать настраиваемый ServiceHost
    Другой вариант, открытый для вас, описанный в по этой ссылке , заключается в использовании настраиваемого ServiceHost, который переопределяет решение WCF не учитывать атрибуты GroupRoot или GroupType для типов сообщений.


Если вы решите использовать подход WSDL-First, WSDL должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8" ?>

<definitions
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:The-Service-namespace"
    xmlns:tns="urn:The-Service-namespace"
    xmlns:s="http://www.w3.org/2001/XMLSchema"
    xmlns:n0="urn:The-Request-namespace"
    xmlns:n1="urn:The-Response-namespace"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    elementFormDefault= "unqualified"
  >

    <types>
      <s:schema targetNamespace="urn:The-Request-namespace" >
        <s:complexType name="Type1">
          <s:sequence>
            <s:element name="x" minOccurs="1" maxOccurs="1" type="s:string"/>
          </s:sequence>
        </s:complexType>
        <s:element name="Type1" type="n0:Type1" />
      </s:schema>


      <s:schema targetNamespace="urn:The-Response-namespace" >
        <s:complexType name="Type2">
          <s:sequence>
            <s:element name="x" minOccurs="1" maxOccurs="1" nillable="false" type="s:string"/>
            <s:element name="y" minOccurs="1" maxOccurs="1" nillable="false" type="s:int"/>
            <s:element name="z" minOccurs="1" maxOccurs="1" nillable="false" type="s:boolean" />
          </s:sequence>
        </s:complexType>
        <s:element name="Type2" type="n1:Type2" />
      </s:schema>

    </types>



<message name="RequestMessage">
   <part name="inPart1" element="n0:Type1" />
</message>
<message name="ResponseMessage">
   <part name="outPart1" element="n1:Type2" />
</message>



<portType name="PortTypeName">
  <operation name="Method1">
      <input message="tns:RequestMessage" />
      <output message="tns:ResponseMessage" />
   </operation>
</portType>



<binding name="InterfaceName" type="tns:PortTypeName">
    <soap:binding
       transport="http://schemas.xmlsoap.org/soap/http"
       style="rpc" />

    <operation name="Method1">
        <soap:operation soapAction="" style="document" />
        <input>  <soap:body use="literal" /> </input>
        <output> <soap:body use="literal" /> </output>
    </operation>
</binding>

</definitions>

Этот WSDL очень прост - он определяет одну операцию, с одним сообщением запроса и одним сообщением ответа.

Обратите внимание, что существует три пространства имен xml:

  • urn: The-Service-namespace
    , используемое для элемента, который переносит запрос и ответ - первый элемент внутри < SOAP: body >
  • urn: The-Request-namespace
    , используемый для элемента, обернутого внутри этой оболочки запроса, который десериалиализуализируется в экземпляр Type1.
  • urn: пространство имен ответа
    , используемое для элемента, обернутого внутри этой оболочки ответа, которая десериализируется в экземпляр Type2.

Если интерфейс веб-служб сложнее, имеет больше операций и, следовательно, больше типов сообщений запросов и ответов, можно добавить больше пространств имен, если хотите, для всех этих дополнительных типов.

-121--3732631-

Более тяжелая инициализация также может быть неправильной в случае загрузки, поскольку она может увеличить время загрузки и вызвать раздражение у конечного пользователя. Я предпочитаю выполнять базовую инициализацию (скажем.., которая занимает < 10 секунд) в Form Load и выполнять оставшуюся часть тяжелой работы после ее отображения пользователю. Для выполнения ожидания пользователя может отображаться индикатор хода выполнения.

3
ответ дан 6 December 2019 в 14:04
поделиться

Делая вещи в событии нагрузки сделают исключения, когда он не проще сготавливается, и IMHO является семантически чище. Практически это не имеет тонны разницы.

1
ответ дан 6 December 2019 в 14:04
поделиться

Способ, которым я это делаю, который может быть не лучшим способом, выглядит следующим образом:

when /the children list page for "(.+)"/
    p = Parent.find_by_name($1)
    parent_children_path(p)
-121--2949022-

Я не уверен, что эта часть верна:

        (setq tmpcplx (+ (* (* tmpreal tmpcplx) 2) cplx))
        (setq tmpreal (+ (- (* tmpreal tmpreal) (* tmpcplx tmpcplx))
           real))

Не перезаписывается ли tempcplx с его новым значением в первой строке, что означает, что вторая строка использует новое значение, а не исходное?

В версии Python вы избегаете этой проблемы, используя tmpb:

  tmpb = tmpcplx
  tmpcplx = tmpreal*tmpcplx*2
  tmpreal = tmpreal*tmpreal - tmpb*tmpb
  tmpcplx += cplx
  tmpreal += real

Мне кажется, что версия Lisp должна сделать нечто подобное, т.е. сначала сохранить исходное значение tmpcplx, а затем использовать это хранилище для вычисления tmpreal:

        (setq tmpb cplx)
        (setq tmpcplx (+ (* (* tmpreal tmpcplx) 2) cplx))
        (setq tmpreal (+ (- (* tmpreal tmpreal) (* tmpb tmpb))
           real))
-121--2975520-

Подумайте о том, что произойдет, если дважды запустить Show или SunDialog для одной и той же формы. Все вещи, которые не могут измениться между этими двумя вызовами, должны находиться в конструкторе; весь код инициализации в зависимости от соответствующего вызова Show (Dialog) должен находиться в обработчике событий, который будет вызываться для каждого из этих вызовов. Например, владелец формы передается не в конструкторе, а в SunDialog , и может отличаться для 2 различных вызовов SunDialog , поэтому все, что зависит от владельца, не должно находиться в конструкторе.

0
ответ дан 6 December 2019 в 14:04
поделиться

Если это допустимый ряд HTML, то функция loadHTML () модуля DOMDocument будет работать, и вы сможете легко перемещаться по структуре. Это хороший способ сделать это, если у вас есть много HTML для работы.

$doc = new DOMDocument();
$doc->loadHTML('<a href="http://stackoverflow.com/">Stack Overflow</a>');
$anchors = $doc->getElementsByTagName('a');
foreach($anchors as $node) {
    echo $node->textContent;
    if ($node->hasAttributes()) {
        foreach($node->attributes as $a) {
            echo ' | '.$a->name.': '.$a->value;
        }
    }
}

производит следующее:

Stack Overflow | href: http://stackoverflow.com/ 
-121--4690953-

Ранее вы бы сделали что-то подобное

$('#foo').animate({opacity: 1},1000).fadeOut('slow');

Первый аниматор ничего не делает, так как у вас уже есть непрозрачность 1 на элементе, но он приостановится на некоторое время.

В jQuery 1.4 они встроили это в рамку, чтобы вам не пришлось использовать взлом, как описано выше.

$('#foo').delay(1000).fadeOut('slow');

Функциональные возможности аналогичны функциям исходного плагина jQuery.delay () http://www.evanbot.com/article/jquery-delay-plugin/4

-121--1069587-

Для более тяжелой инициализации обычно выполняется в событии загрузки. Конструкторы обычно используются для быстрой, простой инициализации полей. Если необходимо выполнить вызов метода, например, для внешней зависимости, необходимо выполнить его из загрузки.

4
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: