Причина использования контейнера 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, и Вы просто изменяете их для удовлетворения специальной ситуации, которая происходит, как правило.
Благодаря нескольким людям, предложившим ToArray, я пришел к правильному ответу - `M.GetBuffer '. ToArray не так уж и плох, но он
GetBuffer просто захватывает ссылку на базовый байт [], что мне и нужно.
Вы можете использовать такие вещи, как 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
}
Вам лучше получить базовый буфер byte [], используя
byte[] buffer = ms.GetBuffer();
, а затем скопировать байтовые данные, используя метод Array.Copy (). Вы можете создать с его помощью новый поток.
You can:
Я предполагаю, что вы работаете на двухъядерном компьютере. Попробуйте запустить другой поток.
Если у вас есть только один поток выполнения в вашем приложении, он может быть запущен только на одном ядре ЦП за раз. Решение состоит в том, чтобы разделить работу пополам и заставить одно ядро процессора выполнять одну половину, а другое ядро - другую половину. Конечно, вы можете обобщить это для работы с 4 ядрами и более ....
Установка приоритета для вашего приложения только перемещает его вверх по очереди, для которой процесс получает первый шанс использовать CPU. Если есть процесс в реальном времени, ожидающий ЦП, он всегда будет получать его до высокого приоритета и так далее по списку приоритетов. Даже если ваше приложение имеет низкий приоритет, оно все равно может максимально использовать ядро ЦП, если у него достаточно работы, и ни один процесс с более высоким приоритетом не хочет использовать это ядро.
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);
Accoring to this M.Clone(); should work. But i may be wrong...