Трудно обойтись без wait -n (например, оболочка в busybox не поддерживает его). Так что здесь есть обходной путь, он не оптимален, потому что он вызывает команды «jobs» и «wc» 10 раз в секунду. Например, вы можете уменьшить количество вызовов до 1x в секунду, если не возражаете подождать немного дольше, чтобы завершить каждую работу.
# $1 = maximum concurent jobs
#
limit_jobs()
{
while true; do
if [ "$(jobs -p | wc -l)" -lt "$1" ]; then break; fi
usleep 100000
done
}
# and now start some tasks:
task &
limit_jobs 2
task &
limit_jobs 2
task &
limit_jobs 2
task &
limit_jobs 2
wait
Вам необходимо создать StringWriter и передать его XmlWriter.
Строковая перегрузка XmlWriter.Create предназначена для имени файла.
Например,
using (var sw = new StringWriter()) {
using (var xw = XmlWriter.Create(sw)) {
// Build Xml with xw.
}
return sw.ToString();
}
Как сказал Ричард, StringWriter
- это путь вперед. Однако есть одна загвоздка: по умолчанию StringWriter
будет рекламировать себя как находящийся в UTF-16. Обычно XML находится в UTF-8. Вы можете исправить это, создав подкласс StringWriter;
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
}
}
. Это повлияет на объявление, написанное XmlWriter
. Конечно, если вы затем запишете строку в другом месте в двоичной форме, убедитесь, что вы используете кодировку, которая соответствует той кодировке, которую вы исправили для StringWriter
. (В приведенном выше коде всегда используется UTF-8; тривиально создать более общую версию, которая принимает кодировку в конструкторе.)
Затем вы должны использовать:
using (TextWriter writer = new Utf8StringWriter())
{
using (XmlWriter xmlWriter = XmlWriter.Create(writer))
{
...
}
return writer.ToString();
}
Я знаю, что это старый ответ, но есть еще один способ сделать это. В частности, если вам не нужна спецификация UTF8 в начале вашей строки, и вы хотите, чтобы текст был с отступом:
using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false))
{ Formatting = Formatting.Indented })
{
// ...
return Encoding.UTF8.GetString(ms.ToArray());
}