Нативные программы выполняются с использованием инструкций, написанных для процессора, на котором они работают.
Интерпретируемые языки - это просто «интерпретированные». Некоторая другая форма инструкций читается и интерпретируется средой выполнения, которая, в свою очередь, выполняет собственные машинные инструкции.
Думайте об этом так. Если вы можете говорить с кем-то на вашем родном языке, это, как правило, будет работать быстрее, чем если бы переводчику приходилось переводить ваш язык на какой-то другой язык, понятный слушателю.
Обратите внимание, что то, что я описываю выше, относится к тому, когда язык работает в интерпретаторе. Существуют интерпретаторы для многих языков, которые также имеют встроенные компоновщики для машинных инструкций сборки. Снижение скорости (как бы это ни было) применимо только к интерпретируемому контексту.
Таким образом, несколько неверно говорить, что язык медленный, скорее это медленный контекст, в котором он работает.
C # не является интерпретируемым языком, даже несмотря на то, что он использует промежуточный язык (IL), он JITted для нативных инструкций перед выполнением, поэтому он имеет некоторые одинакового сокращения скорости, но не все об этом, но я бы поспорил, что если бы вы создали полноценный интерпретатор для C # или C ++, он также работал бы медленнее.
И просто для ясности, когда я говорю «медленно», это, конечно, относительный термин.
У меня возникнет соблазн создать пустой проект службы Windows и просто взять биты, которые имеют отношение к службе; это не так много - несколько ссылок и часть кода в Main
. На самом деле вы можете использовать существующую консоль и как службу , и как консоль - либо проверив аргументы для Main
, либо используя (например) " -console », или я думаю, вы можете проверить Environment.UserInteractive
.
Если он находится в« консольном »режиме, запустите свой код, как сейчас; если он находится в сервисном режиме, запустите код, который вы взяли из проекта шаблона.
Для информации, вы можете также иметь тот же исполняемый файл, что и установщик / деинсталлятор для сервиса! Я делаю это с помощью "-install" / "-uninstall" переключатели. Например, см. Здесь .
Vici WinService превратит консольное приложение в самоустанавливающуюся службу Windows. Это открытый исходный код, и вы можете скачать исходный код. Даже если вы не хотите использовать библиотеку, вы все равно можете почерпнуть из нее некоторые идеи.
Некоторые мысли:
Создать службу Windows с помощью VS 2005
Несколько лет назад я написал набор исполняемых файлов (theads) на основе Perl и т. Д. , который, похоже, имеет те же требования, что и ваши ...
Некоторые вещи, о которых следует помнить:
Вот небольшой пример консоли для вывода в базу данных, файл и консоль с помощью log4net
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using log4net.Config;
using NUnit.Framework;
namespace ExampleConsoleApplication
{
[TestFixture]
class TestClass
{
//private static readonly ILog logger =
// LogManager.GetLogger ( typeof ( TestClass ) );
private static readonly log4net.ILog logger = log4net.LogManager.GetLogger ( System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType );
static void Main ( string[] args )
{
Console.WriteLine ( " START " );
#region LoggerUsage
DOMConfigurator.Configure (); //tis configures the logger
logger.Debug ( "Here is a debug log." );
logger.Info ( "... and an Info log." );
logger.Warn ( "... and a warning." );
logger.Error ( "... and an error." );
logger.Fatal ( "... and a fatal error." );
#endregion LoggerUsage
TestClass objTestClass = new TestClass();
objTestClass.TestMethodNameOK ();
objTestClass.TestMethodNameNOK ();
Console.WriteLine ( " END HIT A KEY TO EXIT " );
Console.ReadLine ();
} //eof method
[SetUp]
protected void SetUp ()
{
//Add Here the Initialization of the objects
}
[Test ( Description = "Add here the description of this test method " )]
protected void TestMethodNameOK ()
{
//build ok use case scenario here - e.g. no exception should be raced '
//Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ( "WriongByPurpose", "Orange" );
//Assert.IsInstanceOfType ( typeof ( Vegetable ), newCarrot );
//Assert.AreSame ( newCarrot, carrot );
//logger.Info ( " I got the newCarrot which is " + newCarrot.Color );
} //eof method
[Test ( Description = "Add here the description of this test method " )]
protected void TestMethodNameNOK () //e.g. the one that should raze Exception
{
//build ok use case scenario here - e.g. no exception should be raced '
//Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ( "WriongByPurpose", "Orange" );
//Assert.IsInstanceOfType ( typeof ( Vegetable ), newCarrot );
//Assert.AreSame ( newCarrot, carrot );
//logger.Info ( " I got the newCarrot which is " + newCarrot.Color );
} //eof method
} //eof class
} //eof namespace
#region TheAppConfig
// <?xml version="1.0" encoding="utf-8" ?>
//<configuration>
// <configSections>
// <section name="log4net"
// type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
// </configSections>
// <log4net>
// <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
// <param name="File" value="Program.log" />
// <param name="AppendToFile" value="true" />
// <layout type="log4net.Layout.PatternLayout">
// <!--<param name="Header" value="======================================" />
// <param name="Footer" value="======================================" />-->
// <param name="ConversionPattern" value="%d [%t] %-5p - %m%n" />
// </layout>
// </appender>
// <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
// <mapping>
// <level value="ERROR" />
// <foreColor value="Red" />
// </mapping>
// <mapping>
// <level value="DEBUG" />
// <foreColor value="HighIntensity" />
// </mapping>
// <mapping>
// <level value="INFO" />
// <foreColor value="Green" />
// </mapping>
// <mapping>
// <level value="WARN" />
// <foreColor value="Yellow" />
// </mapping>
// <mapping>
// <level value="FATAL" />
// <foreColor value="White" />
// <backColor value="Red" />
// </mapping>
// <layout type="log4net.Layout.PatternLayout">
// <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
// </layout>
// </appender>
// <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
// <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.2.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
// <connectionString value="data source=ysg;initial catalog=DBGA_DEV;integrated security=true;persist security info=True;" />
// <commandText value="INSERT INTO [DBGA_DEV].[ga].[tb_Data_Log] ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
// <parameter>
// <parameterName value="@log_date" />
// <dbType value="DateTime" />
// <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'.'MM'.'dd HH':'mm':'ss'.'fff}" />
// </parameter>
// <parameter>
// <parameterName value="@thread" />
// <dbType value="String" />
// <size value="255" />
// <layout type="log4net.Layout.PatternLayout" value="%thread" />
// </parameter>
// <parameter>
// <parameterName value="@domainName" />
// <dbType value="String" />
// <size value="255" />
// <layout type="log4net.Layout.PatternLayout" value="%user" />
// </parameter>
// <parameter>
// <parameterName value="@log_level" />
// <dbType value="String" />
// <size value="50" />
// <layout type="log4net.Layout.PatternLayout" value="%level" />
// </parameter>
// <parameter>
// <parameterName value="@logger" />
// <dbType value="String" />
// <size value="255" />
// <layout type="log4net.Layout.PatternLayout" value="%logger" />
// </parameter>
// <parameter>
// <parameterName value="@message" />
// <dbType value="String" />
// <size value="4000" />
// <layout type="log4net.Layout.PatternLayout" value="%message" />
// </parameter>
// </appender>
// <root>
// <level value="ALL" />
// <appender-ref ref="LogFileAppender" />
// <appender-ref ref="AdoNetAppender" />
// <appender-ref ref="ColoredConsoleAppender" />
// </root>
// </log4net>
//</configuration>
#endregion TheAppconfig
//this is the xml added replace here your log4net and Nunit paths
//<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
// <SpecificVersion>False</SpecificVersion>
// <HintPath>..\..\..\Log4Net\log4net-1.2.10\bin\net\2.0\release\log4net.dll</HintPath>
//</Reference>
//<Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
Каков ваш долгосрочный сценарий использования? Службы Windows может быть достаточно ... но Windows Server 2008 / IIS7 предоставляет несколько интересных новых способов размещения и активации «служб» через службы активации Windows. Служба Windows всегда будет запущена и может потребовать специального кода. С помощью WAS вы можете записать свой хост как обычную службу WCF и активировать ее по запросу при поступлении запросов и деактивировать, когда она не используется. Также существуют другие варианты ... такие как хостинг и создание экземпляров MSMQ,