Как я могу вынудить браузер перерисовать, в то время как мой сценарий делает некоторую тяжелую обработку?

Это зависит от сценария. XmlSerializer, конечно, один путь и имеет преимущество отображения непосредственно на объектную модель. В.NET 3.5, XDocument, и т.д. являются также очень дружественными. Если размер является очень большим, то XmlWriter Ваш друг.

Для XDocument пример:

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));

Или то же с XmlDocument:

XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);

, Если Вы пишете большой поток данных, тогда любой из подходов DOM (такой как XmlDocument / XDocument, и т.д.) быстро возьмет большую память. Таким образом, если Вы пишете 100  XML-файл МБ от [1 116] CSV, Вы могли бы рассмотреть XmlWriter; это более примитивно (неперезаписываемый пожарный шланг), но очень эффективно (вообразите большой цикл здесь):

XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();

Наконец, через [1 112]:

[Serializable]
public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
    public string Nested { get; set; }
}
...
Foo foo = new Foo
{
    Bar = "some & value",
    Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);

Это - хорошая модель для отображения на классы и т.д.; однако, это могло бы быть излишество при выполнении чего-то простого (или если желаемый XML действительно не имеет прямой корреляции к объектной модели). Другая проблема с [1 113] - то, что этому не нравится сериализировать неизменные типы: все должно иметь общедоступного метода get и метод set (если Вы не делаете все это сами путем реализации IXmlSerializable, в этом случае Вы не получили много при помощи [1 115]).

8
задан Shog9 30 July 2009 в 22:51
поделиться

2 ответа

Браузер однопоточный. Пока скрипт запущен, браузер больше ничего делать не может. Если вы хотите сделать что-то вроде индикатора выполнения, вы должны использовать setTimeout () или setInterval () и разбить вашу задачу на более мелкие части, которые запускаются с интервалом. . Это оставляет промежутки между запусками скрипта, возвращая управление браузеру, где он может выполнять перерисовку.

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

Попробуйте периодически прерывать ваш сценарий. Вы должны иметь возможность использовать

setTimeout(nextFunction, 0); 

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

6
ответ дан 5 December 2019 в 08:25
поделиться
Другие вопросы по тегам:

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