» »

C# in servisi

C# in servisi

MarCar ::

Imam en problem.

Namreč v C# imam napisan service kateri mi kopira iz lokalnega racunalnika datoteke na nek drugi omrezni racunalnik.

Ko testiram, testiram na interval 60 sekund, ok, vse deluje super, dokler ne testiram kaj se zgodi če pride do izpada omrežne povezave.

Service preneha delovati.

Na nastavitvah sem nastavil, da se po napaki resetira, in ok, service deluje, ampak ko priključim računalnik nazaj na omrežje še vedno noče pošiljat.

Lahko kdo kaj pomaga z kakim nasvetom?

KernelPanic ::

Daj pokazi malo kode, pa da vidimo, kaj se dogaja!

urbecar ::

Najverjetneje ne loviš kakšne izjeme.

Ericssony ::

Zgodi se izjema, ki je ne prestrežeš in servis "crkne".

MarCar ::

Lovim izjemo.

Ugotovil sem, da ko recimo priklopim lokalni racunalnik nazaj na omrežje, da se ne izvaja normalno, ampak, kot da ne more narediti konekcije na omrezni vir, racunalnik.
To sem ugotovil tako, da sem na koncu programcka naredil try catch in mi izpise log.

Kodo dodam pozneje, ker sem trenutno na drugi lokaciji.

Kot vem lih Service samega sebe ne more resetirati, mogoče bi samo znova moral narediti povezavo.

_Dormage_ ::

Probaj pred kopiranjem pingat naslov. Če pinga izvedi kopiranje če ne pa preskoči.

fx ::

V C# sem napisal service, kateri mi zažene programček("CAN")ob zagonu.

Napisal sem še si program, kateri mi pregleduje in prikazuje status servica za CAN, MySQL in Apache2.2.
V tem programu lahko tudi ustavim ali poženem enega od omenjenih servisov ročno. Ampak ko želim ustaviti ali zagnati CAN pa me komande ne ubogajo, čeprav za MySQL in Apache pa deluje. CAN service lahko ustavim in ponovno poženem lahko samo preko start->run->services.

v servicu za CAN sem dodal ProjectInstaller. tako da potem samo v inno setup vpišem
Filename: "{app}\{#GSSServerPath}\gssserver.exe"; Parameters: "--i";  Flags: runascurrentuser shellexec waituntilterminated runhidden;


Tukaj pa še kode:
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
	private ServiceProcessInstaller serviceProcessInstaller;
	private ServiceInstaller serviceInstaller;
	
	public ProjectInstaller()
	{
		serviceProcessInstaller = new ServiceProcessInstaller();
		serviceInstaller = new ServiceInstaller();
		// Here you can set properties on serviceProcessInstaller or register event handlers
		serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
		serviceProcessInstaller.Password = null;
		serviceProcessInstaller.Username = null;
		
		serviceInstaller.ServiceName = fxCAN.MyServiceName;
		serviceInstaller.DisplayName = fxCAN.MyServiceName;
		serviceInstaller.StartType = ServiceStartMode.Automatic;
		
		this.Installers.AddRange(new Installer[] { serviceProcessInstaller, serviceInstaller });
	}
}

static void Main(string[] args)
{
	
	if (System.Environment.UserInteractive)
	{
		string parameter = string.Concat(args);
		switch (parameter)
		{
			case "--i":
			case "--install":
				ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
			break;
			
			case "--u":
			case "--uninstall":
				ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
			break;
		}
	}
	else
	{
		// To run more than one service you have to add them here
		ServiceBase.Run(new ServiceBase[] { new fxCAN() });
	}
}
public class fxCAN : ServiceBase
{
	public const string MyServiceName = "fxCAN";
			
	private ServiceController service;

	public fxCAN()
	{
		InitializeComponent();
		
	}

	private void InitializeComponent()
	{
		this.ServiceName = MyServiceName;
		this.CanStop = true;
		this.CanHandlePowerEvent = true;
		this.CanHandleSessionChangeEvent = true;
		this.CanPauseAndContinue = true;
		this.CanShutdown = true;  
	}

	/// <summary>
	/// Clean up any resources being used.
	/// </summary>
	protected override void Dispose(bool disposing)
	{
		base.Dispose(disposing);
	}

	/// <summary>
	/// Start this service.
	/// </summary>
	protected override void OnStart(string[] args)
	{	
		ProcessStartInfo bat = new ProcessStartInfo();
		bat.UseShellExecute = true;
		bat.WorkingDirectory = @"C:\";
		bat.FileName = "start_fxcan.bat";
		Process p = Process.Start(bat);		
	}

	/// <summary>
	/// Stop this service.
	/// </summary>
	protected override void OnStop()
	{
		ProcessStartInfo bat = new ProcessStartInfo();
		bat.UseShellExecute = true;
		bat.WorkingDirectory = @"C:\";
		bat.FileName = "stop_fxcan.bat";
		Process p = Process.Start(bat);	
	}
}

Lep pozdrav,

fx

Zgodovina sprememb…

  • spremenil: fx ()

mihies ::

Morda neumno vprašanje, ampak zakaj sploh potrebuješ servis? Daj zagon v Task Scheduler, pa bo.

Drugače pa, če že nimaš nekega sledenja (logging), lahko pogledaš v Event Viewer, če se je tam kakšna izjema ujela.
http://blog.rthand.com/
SLODUG - uporabniška skupina
https://www.facebook.com/groups/slodug/


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Program za set back time (RUN AS DATE)

Oddelek: Programska oprema
374866 (4490) Yacked2
»

c# tiho tiskanje slik.

Oddelek: Programiranje
101947 (1618) OmegaM
»

Windows 7 Installer (64-bit) - težave

Oddelek: Programska oprema
152993 (2383) fr!Xy
»

ASP.NET pisanje datoteke

Oddelek: Programiranje
91118 (996) King80
»

Windows Installer problem

Oddelek: Pomoč in nasveti
62146 (2073) Myth

Več podobnih tem