Хостинговые службы запускаются при запуске хоста. В WebHost размещенные сервисы будут запущены сразу после запуска приложения . Это означает, что при правильной реализации ваша размещенная служба будет работать без запроса на вход.
Когда я пробую ваш пример размещенной службы в новом приложении ASP.NET Core, он работает просто отлично, поэтому, если он не работает для вас, то, очевидно, ваша фактическая реализация KontolerTimer
не верна .
MemoryStream
версия расточительна в этом случае. MemoryStream
полезно, если Вы хотите выполнить Stream
- как работа, но не хотят фактический файл. Если Вы пишете файл, то просто пишут в файл. Это избегает потребности буферизовать все данные в памяти.
Это - излишество и отходы.
Два ключевых подхода на основе
первое требует создания в модели памяти документа (для которого DOM является моделью, разработан). После того как Вы закончены с ним просто пишущий непосредственно в поток файла, прекрасен.
Второе позволяет Вам сохранять значительную память и сложность и просто использовать XmlWriter, который может указать непосредственно в конец на поток (в этом случае поток файла).
Ни на каком этапе это необходимый для использования MemoryStream
Если Вы (по некоторым причинам) хотите гарантировать XmlWriter succeedes (т.е. иначе файл мог бы быть усеченным, но в большинстве случаев это произойдет из-за - как упомянуто - не закрывающие тэги), можно использовать временный поток файла, fx что-то подобное этому:
public class TempFileStream : FileStream
{
public TempFileStream(Action<string> onClose)
: base(Path.GetTempFileName(), FileMode.OpenOrCreate, FileAccess.ReadWrite)
{
this.CloseDelegate = onClose;
}
protected Action<string> CloseDelegate
{
get;
set;
}
public override void Close()
{
base.Close();
if (File.Exists(this.Name))
{
this.CloseDelegate(this.Name);
}
}
}
Используемый как:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
using (TempFileStream tfs = new TempFileStream(f => File.Move(f, filename))
using (XmlWriter writer = XmlWriter.Create(tfs, settings))
{
writer.WriteStartDocument(true);
writer.WriteStartElement("parentelement");
writer.WriteEndElement();
writer.WriteEndDocument();
}
Это не использует большую память (конечно, она только делает/делает больше смысла, когда получающийся XML является большим),
Вы не должны использовать MemoryStream для использования XmlWriter. XmlWriter может непосредственно записать в файл; можно использовать другую перегрузку XmlWriter. Создайте метод, который берет имя файла в качестве аргумента, или вместо того, чтобы писать в MemoryStream, Вы могли также записать в XmlTextWriter или FileStream.
Так, Вы 2-й codesnippet могли быть записаны как:
using( FileStream fs = ... )
{
XmlWriter writer = XmlWriter.Create (fs);
}
AFAIK, XmlWriter не защитит Вас от создания неправильно построенного Xml.
Это правда, что подход с потоком памяти расточителен для простых операций, но он очень полезен для таких случаев, как сохранение xml как зашифрованного файла, как сжатого файла и т. д.
Я думаю, что использование потока памяти было бы полезно при создании документа в веб-приложении или веб-сервисе. Местоположение файла может конфликтовать с другим процессом, который может выполнять ту же самую обработку, что может привести к недействительным результатам. В потоке памяти обработка должна быть разделена.