Как я “разветвляю” Поток в.NET?

Причина использования контейнера DI состоит в том, что у Вас не должен быть миллиарда свойств, предварительно сконфигурированных в Вашем коде, которые являются просто методами get и методами set. Вы действительно хотите к hardcode все те с новым X ()? Несомненно, у Вас может быть значение по умолчанию, но контейнер DI позволяет создание одиночных элементов, которое чрезвычайно легко и позволяет Вам фокусироваться на деталях кода, не разной задаче инициализации его.

, Например, Spring позволяет Вам реализовывать интерфейс InitializingBean и добавлять afterPropertiesSet метод (можно также определить "init-метод", чтобы не связывать код с Spring). Эти методы позволят Вам удостоверяться, что любой интерфейс, определенный как поле в Вашем экземпляре класса, настроен правильно после запуска, и затем у Вас больше нет к пустой проверке своих методов get и методов set (предполагающий, что Вы действительно позволяете Вашим одиночным элементам оставаться ориентированными на многопотоковое исполнение).

, Кроме того, намного легче сделать сложные инициализации с контейнером DI вместо того, чтобы делать их самостоятельно. Например, я помогаю с использованием XFire (не CeltiXFire, мы только используем Java 1.4). Приложение использовало Spring, но это, к сожалению, использовало механизм конфигурации services.xml XFIRE. Когда Набор элементов должен был объявить, что имел НУЛЬ или больше экземпляров вместо Одного или нескольких экземпляров, я должен был переопределить часть обеспеченного кода XFire для этого конкретного сервиса.

существуют определенные значения по умолчанию XFire, определенные в его бобовой схеме Spring. Так, если мы использовали Spring для конфигурирования сервисов, бобы, возможно, использовались. Вместо этого что произошло, был то, что я должен был предоставить экземпляр определенного класса в файле services.xml вместо того, чтобы использовать бобы. Чтобы сделать это, я должен был предоставить конструктору и настроить ссылки, объявленные в конфигурации XFire. Реальное изменение, которое я должен был делать требуемым, что я перегружаю единый класс.

, Но, благодаря файлу services.xml, я должен был создать четыре новых класса, установив их значения по умолчанию согласно их значениям по умолчанию в конфигурационных файлах Spring в их конструкторах. Если бы мы были в состоянии использовать конфигурацию Spring, я, возможно, просто заявил:

<bean id="base" parent="RootXFireBean">
    <property name="secondProperty" ref="secondBean" />
</bean>

<bean id="secondBean" parent="secondaryXFireBean">
    <property name="firstProperty" ref="thirdBean" />
</bean>

<bean id="thirdBean" parent="thirdXFireBean">
    <property name="secondProperty" ref="myNewBean" />
</bean>

<bean id="myNewBean" class="WowItsActuallyTheCodeThatChanged" />

Вместо этого это походило больше на это:

public class TheFirstPointlessClass extends SomeXFireClass {
    public TheFirstPointlessClass() {
        setFirstProperty(new TheSecondPointlessClass());
        setSecondProperty(new TheThingThatWasHereBefore());
    }
}

public class TheSecondPointlessClass extends YetAnotherXFireClass {
    public TheSecondPointlessClass() {
        setFirstProperty(TheThirdPointlessClass());
    }
}

public class TheThirdPointlessClass extends GeeAnotherXFireClass {
    public TheThirdPointlessClass() {
        setFirstProperty(new AnotherThingThatWasHereBefore());
        setSecondProperty(new WowItsActuallyTheCodeThatChanged());
    }
}

public class WowItsActuallyTheCodeThatChanged extends TheXFireClassIActuallyCareAbout {
    public WowItsActuallyTheCodeThatChanged() {
    }

    public overrideTheMethod(Object[] arguments) {
        //Do overridden stuff
    }
}

, Таким образом, конечный результат состоит в том, что четыре дополнительных, главным образом бессмысленных класса Java должны были быть добавлены к кодовой базе для достижения влияния что один дополнительный класс и некоторая простая достигнутая информация о контейнере зависимости. Это не "исключение, которое доказывает правило", это - правило... обрабатывающее причуды в коде, является намного более чистым, когда свойства уже обеспечиваются в контейнере DI, и Вы просто изменяете их для удовлетворения специальной ситуации, которая происходит, как правило.

8
задан Community 23 May 2017 в 11:43
поделиться

7 ответов

Благодаря нескольким людям, предложившим ToArray, я пришел к правильному ответу - `M.GetBuffer '. ToArray не так уж и плох, но он

  • делает копию
  • получает только часть буфера

GetBuffer просто захватывает ссылку на базовый байт [], что мне и нужно.

2
ответ дан 5 December 2019 в 10:42
поделиться

Вы можете использовать такие вещи, как MiscUtil.IO.NonClosingStreamWrapper в MiscUtil , который обертывает Stream и просто игнорирует Закройте запросы / Удаление . Именно для этой цели.

void R(MemoryStream M)
{
    using (B = new BinaryWriter(new NonClosingStreamWrapper(M)))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}    
5
ответ дан 5 December 2019 в 10:42
поделиться

Вам лучше получить базовый буфер byte [], используя

byte[] buffer = ms.GetBuffer();

, а затем скопировать байтовые данные, используя метод Array.Copy (). Вы можете создать с его помощью новый поток.

7
ответ дан 5 December 2019 в 10:42
поделиться

You can:

  • Call M.ToArray() to get the stream as an array of bytes.
  • Subclass BinaryWriter and override the Dispose method to prevent closing of the child stream
2
ответ дан 5 December 2019 в 10:42
поделиться

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

Если у вас есть только один поток выполнения в вашем приложении, он может быть запущен только на одном ядре ЦП за раз. Решение состоит в том, чтобы разделить работу пополам и заставить одно ядро ​​процессора выполнять одну половину, а другое ядро ​​- другую половину. Конечно, вы можете обобщить это для работы с 4 ядрами и более ....

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

1
ответ дан 5 December 2019 в 10:42
поделиться

A somewhat naive approach is to use

byte buf[] = MemoryStream.ToArray();

To copy the stream contents to a byte array. You can turn it back into a stream with

MemoryStream ms = new MemoryStream(buf);
0
ответ дан 5 December 2019 в 10:42
поделиться

Accoring to this M.Clone(); should work. But i may be wrong...

-1
ответ дан 5 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

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