- Házimozi belépő szinten
- VR topik
- Autós kamerák
- Bluetooth hangszórók
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Multifunkciós adattároló érkezett a Patriot színeiben
- Úgy tér vissza a Commodore 64, ahogy titkon mindenki várja
- Analóg fényképezés
- Melyik tápegységet vegyem?
- Iszonyatos mennyiségű hulladékkal járhat a Windows 10 terméktámogatásának vége
Új hozzászólás Aktív témák
-
Raftsman
csendes tag
-
joysefke
veterán
válasz
DrojDtroll #9398 üzenetére
FormatException? esetleg az alkalmazás definiálhatja a saját típusait...
-
DrojDtroll
veterán
Sziasztok!
ha egy konfigurációs értékben van hiba(nem alakítható a megfelelő formátumúra) milyen exception-nel térnétek vissza? -
martonx
veterán
válasz
Dexter74 #9390 üzenetére
Ezer éve preóbálkoztam utoljára winforms és classic EF-el.
Azt javaslom, próbáld meg esetleg .Net Core-al. PomeloFoundation/Pomelo.EntityFrameworkCore.MySql: Entity Framework Core provider for MySQL and MariaDB built on top of MySqlConnector (github.com) -
sztanozs
veterán
(bocsi nem neked, neki ment volna)
TL;DR
SQLite-ban nincs DateTime típus, ki kell iratni simán stringbe és meg kell néz ki, hogyan néz ki, mert lehet kézzel rakták be, nem a megfelelő datetime funkciókkal.Bővebben az SQLite doksiból:
2.2. Date and Time Datatype
SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. -
Keem1
veterán
válasz
Dexter74 #9390 üzenetére
Kifutottam a szerkesztési időből, de ez kipróbálva, 100% működik. Lehet ezt még variálni, van hozzá helper (amivel akár még egyszerűbb), de ez egy teljesen alap és tutira működő megoldás, akár GUI-s, akár console-os appról legyen szó.
Azt azért hozzáteszem, hogy form-os app esetén biztos van szebb, elegánsabb, jobb megoldás, de én console és webappot használok, formra nincs szükségem.
string connstr = "Server=yourmysqlserver;Port=3306;Database=yourdatabase;Uid=yourmysqluser;Pwd=yourmysqlpass";
using (MySqlConnection conn = new MySqlConnection(connstr))
{
conn.Open();
using (MySqlCommand cmd = new MySqlCommand("SHOW TABLES;", conn))
{
MySqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
// Ha van DataGrid a window-n (mert nem console app), akkor még:
dataGridView1.DataSource = dt;
}
conn.Close();
}
-
Dexter74
tag
Sziasztok,
Kezdő programozóként az alábbi problémába ütköztem és nem tudok továbblépni. Visual Studio 2019-et használok, és Form-ot kellene MySql adatbázissal összekötnöm, de az Entity Framework kifog rajtam.
Megvan a Data Connection localhoston keresztül, kapcsolat aktív, táblákat Server Explorerben látom.
Természetesen a MySql for Visual Studio (1.2.9 ver) és a MySql Connector Net (8.0.21 ver) telepítve lett. Jelenleg ezt a párosítást javasolták, ami együtt működik.
A MySql Application Configuration-ban kijelöltem, hogy a MySql-t használom és az Entity Framework 6.x verzióval szerertném.
A Models mappában hozzá kívántam volna adni egy új ADO.NET Entity Data Model-t, de az Entity Framework verziónál nem a 6-os, hanem az 5.X aktív, a 6.x nem is választható. Így természetesen nem is tudom folytatni a projektet. Itt akadok meg.
Próbálgattam nyomozni, hogy mi lehet a baj, de nem sok eredménnyel. Próbáltam a MySql for Visual Studio és a MySql Connector Net újratelepítését, nem segített.
Próbáltam új (szűz projektben) csak ez ADO.NET Data Model-t létrehozni, de nem sikerült.
Azt is próbáltam, hogy az App.Config tartalmát ürítem ki egy szűz projjekt App.Configéval és újra építeni az elejétől a kapcsolatokat ez sem segített.
Végső elkeseredésemben a VS -t is újratelepítettem és láss csodát az első indulásnál tök jó volt minden. Jó akkor kezdem a projektet... gondoltam magamban és töröltem a próbát, majd új projekt és minden kezdődött előröl. Nem tudom már mit kellene tennem, hogy folytatni tudjam a programot. Ha tudtok kérlek segítsetek. Köszi. -
joysefke
veterán
válasz
alratar #9386 üzenetére
Mivel úgy tűnik, hogy a DateTime parsolással van a hiba, ezért meg kéne nézni hogy
1.
az SqlReaderből ki jön-e egyáltalán a rekord "Date" oszlophoz tartozó értéke, ha igen akkor2.
Megfelelő (az általad megadottal kompatibilis) formátumban jön-e ki3.
Megnézni, hogy a format string amit megadtál egyáltalán érvényes-e. Tippre nem: Custom date and time format strings | Microsoft Docs
A hónap az nagy 'M' a perc az kis 'm'4,
Amíg az egész nem működik addig külön-külön kéne a db-ből olvasást aztán annak parsolását tesztelni.Legjobb lenne erre valami wrapper...
-
alratar
addikt
Sziasztok,
SQLite-ból próbálok adatokat kiolvasni, de a FormatException: A karakterlánc nem értelmezhető érvényes DateTime értékként. hibát kapom.
A következtet átalakításokkal próbálkoztam:Convert.ToDateTime(reader["Date"]),
DateTime.ParseExact(reader["Date"].ToString(), "yyyy-mm-dd", null),
Tudtok segíteni?
-
válasz
Dawide@axele #9381 üzenetére
Megírni senki nem fogja itt helyetted. Ha teszel fel értelmes kérdést, akkor segítünk.
-
martonx
veterán
válasz
Dawide@axele #9381 üzenetére
Segítek Visual Studio és C# fog hozzá kelleni
némi guglizást is javaslok a témában.
-
cigam
titán
válasz
Dawide@axele #9381 üzenetére
Az ugye megvan, hogy egyetlen kérdőmondát nem volt a hozzászólásodban?
Írd le pontosan hol akadtál el, mi nem működik, plusz a hozzá tartozó kódrészletet. -
Dawide@axele
aktív tag
Sziasztok!
Segítségre lenne szükségem.Egyetemi beadandót kell írnom viszont nem vagyok valami jó programozásból.Ehhez kellene a segítség: A feladat készíteni egy REST API-t ( PHP-ban csináltam és JSON-al dolgozom, MySQL adatbázissal).
Emellé egy WCF alkalmazás ami a REST API-n keresztül szerzi be az adatokat, ehhez pedig egy WPF / WInForm klienst kell csinálni.Be kell jelentkezni server oldalon és ott kell tárolni az adatokat is. A REST APi meg van és működik de a többi feldja a leckét. -
bandi0000
nagyúr
válasz
sztanozs #9377 üzenetére
Jó, hàt el kellene dönteni a cégeknél is, hogy mi a fontos, suliknál eltér, valahol 3 félêven át is tollnak 1 nyelvet, míg máshol, minden félêvben más nyelv, itt nyilván mindig az alapoktól megy a tanítás...Én is voltam nem 1 cégnél interjún, kérdezték, hogy milyen nyelvek mennek, akkor pont a c# és angular typescript ment nálam, és mondták, hogy szeretik cserélgetni az embereket 2-3 hetente a projekteken, a hirdetêsben is vagy 5-6 nyelv volt felsorolva ,és mindenhez is kellett vna érteni
-
Keem1
veterán
Egyetértek, én is használok REST API-t, persze éles rendszeren, de eszembe se jutna ilyesmi. Szerveroldali az access check, ráadásul https csatorna, de emellett a kliens nem küld még plain text passwordöt sem, csak hash-t.
És ez semmi NASA vagy bank vagy ilyenek, hanem webshop.
-
sztanozs
veterán
Azért az, hogy bármelyik be sem jelentkezett felhasználó megkapja a teljes identity táblát szerintem nem szabadna túlmutasson egy főiskolai beadandón.
Még ha működik is, én úgy húznám meg az illetőt, mint a szél. Ezeknek a sz@r berögződések a javítását aranyárban mérik, amint éles kódot készít az illető egy cég számára. -
Keem1
veterán
-
vlevi
nagyúr
válasz
joysefke #9369 üzenetére
Háát, pl., ha MSSQL, és LINQ, akkor az pont meg tudja oldani, hogy beleszövi a where feltételbe. Persze, ha úgy kezdesz hozzá az egészhez.
Meg még inkább, de ebbe már ne menjünk bele, egy valódi rendszerben nem így van megoldva a bejelentkezés, de egy beadandó feladatnál ez még elmegy. Ha ez volt a feladat, akkor ez volt.
Persze, ha egy kicsit is komolyabb lenne a dolog, akkor az egyik rest requestnek annak kellene lennie, hogy jó-e a felhasználónév/jelszó. Ezt nem a kliens oldalon kell eldönteni.Jelen esetben is csak annyi a lényeges, hogy a response data-ban benne van-e a felhasználónév, jelszó.
Csak így nagyon csúnyán (bocsi, telefonon nincs VS telepítve
)
valami ilyesmit akartam mondani.if (response.Data.where(x => x.username.equals(edituser.text) && x.pass.equals(editpw.text)).firstordefault != null)
{
ShowMessage("Helyes válasz, nyalhat :)");
}
-
joysefke
veterán
Ilyen dolgok miatt nem kell végigmenni az egész listán Erre pont jó a linq, amivel egyszerűen lekerdezhetetd, hogy a respomse.data lista elemei között van-e olyany akinek a felhasználó neve és jelszava egyezik.
Vagy akár eleve nem kéne a szervernek leküldenie a teljes usernév/pwd táblát -
joysefke
veterán
Elég naív és gyanútlan ez a RestAPI
de nem vezetett sikerre.
Ez túl tág.Gondolom egyszerre egy felhasználó akar bejelentkezni, a WinForms applikációdnak tehát elég lenne leellenőrizni, hogy a RestAPI-tól lekért listában benne van-e a megfelelő felhasználó, illetve ha igen akkor a bevitt jelszó megegyezik a listában szereplővel.
Jelenleg te végiglépdelsz a List<Felhasznalo>-n és minden elemére megnézed az egyezőséget és hívsz egy MessageBox.Show-t...
-
Ukeve
tag
Sziasztok!
Segítséget szeretnék kérni Tőletek. Írnom kell egy REST.API beadandó. Minden (a beadandóhoz mérten) tökéletesen működik, csak a bejelentkezést nem tudom megoldani. Annyi lenne az elképzelés, hogy ha a felhasználó a 2 Textboxba (username, pw) beírja az adatokat, akkor a kapcsolódok az adatbázishoz és egy Select utasítással lekérem az adatokat egy listába, ahol meg összehasonlítom a két adatot, és ha megegyeznek, akkor szimplán kiírja, hogy "Sikeres bejelentkezés", ha meg nem egyeznek, akkor "Sikertelen belépés".
Én ezt eddig így próbáltam megoldani, de nem vezetett sikerre. Megnéztem debugolással is, ott a listában benne vannak az adatok, tehát az adatbázissal a kapcsolat rendben van és a 2 string is jól tárolja a TextBox értékét.
Teljesen rossz úton járok, vagy csak valami kis dolgot rontottam el?Előre is köszi a segítséget!
-
cigam
titán
Azt szerettem volna, ha felbontáshoz igazítja a betűméretet (A program maximalizálva indul).
screenHeight = SystemParameters.PrimaryScreenHeight;
// Kiszámolja, hogy hol van a képernyő fele
shiftScreen = SystemParameters.PrimaryScreenWidth / 2;
// A képernyőmagassághoz igazítja a betüméretet
minuteLabel.FontSize = screenHeight / 1.5;
minuteLabel.Width = shiftScreen;
secondsLabel.FontSize = screenHeight / 1.5;
secondsLabel.Width = shiftScreen;
// a kettőspont picit kissebb, így jobban néz ki
colonLabel.FontSize = screenHeight / 3;
Egy kicsit elszámoltam magam. fHD felbontáson szépen működik,
de kissebb felbontáson (1280x1024)túl széles(nagy) a betűméret.
Hogyan lehet jól/másképpen skálázni? -
cigam
titán
Egy stoppert készítenék, és a perc/másodperc kijelzésre kábel-eket használok. Létezik valahol olyan beállítás ami kikényszerít, hogy a beleírt számot 2 karakteren jelenítse meg, vagy nekem kell lekezelni, hogy ha egy szám kisseb mint 10, akkor elé írok egy 0-át?
Anno még 8bites mikwrogépeken volt a érint using, amivel kimaszkozhattam, hogyan írja ki az adatot. Létezik itt is ilyesmi? -
Keem1
veterán
Srácok, ha .NET Core projectet szeretnék Linux-ARM-re publish-olni, ezt kapom:
A probléma gyökere, ha ezt a MySQL NuGet package-et telepítem (akár úgy, hogy a kódban semmi hivatkozás nincs hozzá, még a using által sem, tehát csak szimplán telepítem hozzá).
A hivatkozott fájlban semmi érdemi infó nincs. Ha ténylegesen használatba veszem a motyót, és nem publish-sal, hanem simán felmásolással a céleszközre teszem, akkor a dotnet program.dll paranccsal olyan szépen futtatható, hogy a MySQL is gyönyörűen megy. Tehát nem inkompatibilis, vagy bármi hasonló, mert működik, egyszerűen a publish-nál valami miatt elvérzik.Azért lenne jó, ha így sikerülne platform-dependent módon fordítani, mert akkor a dotnet program.dll helyett sima Linuxos paranccsal (./program) menne (és megy is, ha kiszedem a MySQL package-et). Ja, és megy az SQLite Nuget package-dzsel, meg sok más egyébbel is, csak ezzel nem.
Hogy találhatnám ki, hogy mi a baja?
Szerk: továbbmegyek, a "Portable" opción kívül semmi mással nem megy. Se win64, se win86, se linux64, semmi. Csak Portable
-
Szancsó
aktív tag
Sziasztok!
Segítségre/iránymutatásra lenne szükségem videók kezelésével kapcsolatban, mert semmilyen tapasztalatom nincs velük.
A cél az lenne, hogy egy videó állományra dinamikus tartalmat tudjak beszúrni képkockánként. Vagyis ki kellene tömöríteni, hogy az adott infót el tudjam helyezni frame-enként, majd utána visszatömöríteni.
(Dinamikus dolog lenne, nem vízjel vagy ilyesmi - ha hasonlítani kellene akkor egy fényképező keresőjében lévő hisztogramhoz hasonlítanám. De ez csak példa nem erre kell fókuszálni.)
VisioForge Video Edit SDK .Net -et találtam: van normálisnak űnő doksija, tudja ami nekem kell, ellenben fizetős. Lehet, hogy sima FFMpegCore is tudja, ami nekem kell, csak jobban meg kellene nézni...
Valakinek van hasonlóra bevált dolga? -
joysefke
veterán
Én fognám az androidos komponenseket, megnézném mit csinálnak, aztán azt, hogy ezekből mennyi érhető el Xamarin.Forms-ból cross platform megvalósítással pld https://docs.microsoft.com/hu-hu/xamarin/essentials/?WT.mc_id=docs-dotnet-xamarin
gondolom amennyire lehet egységesíteni szeretnéd a kódbázist
Aztán ez persze csak elmélet, nem csináltam ilyen portolást
-
Sziasztok!
Van a cégnél egy kisebb alkalmazás ami Xamarinban írodott Androidra. Mennyire macera ezt portolni IOS-re? Nem dolgozott itt még senki almás ágon, milyen becslést lehet erre adni
-
joysefke
veterán
válasz
Tomi_78 #9342 üzenetére
programot írnék SharpDevelop környezetben
Ebben az izében? https://en.wikipedia.org/wiki/SharpDevelop#/media/File:SharpDevelop.png
Visual Studio Community ingyen van. -
disy68
aktív tag
válasz
Tomi_78 #9349 üzenetére
"Az OOP lényegét is úgy mondanám el, hogy tagolva vannak benne a dolgok, az események csak azok szükségessége esetén hajtódnak végre, és nem folyamatosan, ciklikusan figyeli a program az összes tennivalót."
Hmm. Az egymondatos definíció mindig nehéz, de azért az események nem igazán tartoznak ide.
OOP alapelvek:
- Absztrakció
- Polimorfizmus
- Öröklődés
- Egységbezárás -
Tomi_78
aktív tag
Utánanézek a könyvnek, bár nekem is vannak programozással (C++ és C# is) foglalkozó köteteim, igaz, végigolvasni még egyet sem volt időm vagy türelmem. Inkább célirányosan kutatok, ha szembesülök valami problémával, mert azt már nem kell nekem elmagyarázni, hogy mi a tömb, az elágazás vagy a ciklus, hanem inkább az olyan dolgokat, amik az adott fejlesztőkörnyezet sajátosságai, mint pl. hogy C#-ban hol kell elhelyezni a globális változókat a kódban vagy hogy bizonyos deklarálásokat milyen formában kell megadni.
Lehet, hogy velem van a hiba, hogy szájbarágósan és nem bikkfanyelven várom el a szakkönyvektől is a magyarázatokat, dehát ez van.
Az OOP lényegét is úgy mondanám el, hogy tagolva vannak benne a dolgok, az események csak azok szükségessége esetén hajtódnak végre, és nem folyamatosan, ciklikusan figyeli a program az összes tennivalót. -
Keem1
veterán
válasz
Tomi_78 #9342 üzenetére
Ahogy látom, nem csak C#, hanem úgy általában objektumorientált programozási alapok is csiszolásra szorulnak. Én nem vagyok tanár, és a topik témája is bőven kimerül a tanításban, de én a következőket javasolnám neked:
- rengeteg jó forrás van (leginkább angol nyelven), mégis egy egyszerű, könnyen tanulható és magyar nyelvű könyvet javasolnék: Sipos Marianna: Programozás élesben - C# (megadja a kezdő löketet, az abszolút alapokat)
- kezdésnek én WinForms helyett console-ban gyakorolnék, alapoznék. Ha ez flottul megy, akkor jöhet az ablakozás. Az ablakozás mindaddig várhat, míg a nyelv alapjait meg nem ismered: keywordök, objektumok, névterek, metódusok, láthatóság, öröklődés, stb.Tényleg csupa jó tanácsként szánom a fentieket, és elnézést, ha tévedtem, rosszul mértem fel, hogy nem csak C#-ban, de úgy alapból OO programozásban is abszolút kezdő vagy.
Amúgy meg a C# szerintem egy szuper nyelv: egyszerű, könnyen kezelhető, de mégis sokoldalú. Főleg a rengeteg forrásanyag, tutorial, 3rd party libraryk miatt. -
Tomi_78
aktív tag
Bocs, az előbb javítottam és láttam, hogy nem kezdőérték nélküli a Deneverek tömb... Így javítottam a programomon, de most csak egy denevér jelenik meg, az sem animálódik és nem is mozog:
namespace Animacios
{
public partial class MainForm : Form
{
Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
class Deneverek
{
public int dirx,diry,xhely,yhely;
public Bitmap kepe;
};
Deneverek[] egydenever;
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//
// TODO: Add constructor code after the InitializeComponent() call.
//
deneverkepe1.MakeTransparent();
deneverkepe2.MakeTransparent();
egydenever = new Deneverek[3];
int svsz;
for (int i=0; i<3; i++) {
egydenever[i]= new Deneverek();
System.Random vsz = new System.Random();
svsz = vsz.Next(1);
if (svsz==0) {
egydenever[i].dirx = -1;
} else {
egydenever[i].dirx = 1;
};
svsz = vsz.Next(1);
if (svsz==0) {
egydenever[i].diry = -1;
} else {
egydenever[i].diry = 1;
};
svsz = vsz.Next(1);
if (svsz==0) {
egydenever[i].kepe = deneverkepe1;
} else {
egydenever[i].kepe = deneverkepe2;
};
egydenever[i].xhely=vsz.Next(1,800-egydenever[i].kepe.Width);
egydenever[i].yhely=vsz.Next(1,600-egydenever[i].kepe.Height);
};
}
void AnimIdozitoTick(object sender, EventArgs e)
{
for (int i=0; i<3; i++) {
if (egydenever[i].kepe==deneverkepe1) {
egydenever[i].kepe=deneverkepe2;
}
else {
egydenever[i].kepe=deneverkepe1;
};
};
}
void MozgIdozitoTick(object sender, EventArgs e)
{
for (int i=0; i<3; i++) {
switch (egydenever[i].dirx) {
case -1:
if (egydenever[i].xhely>0) {
egydenever[i].xhely-=4;
}
else egydenever[i].dirx*=-1;
break;
case 1:
if (egydenever[i].xhely<800-egydenever[i].kepe.Width) {
egydenever[i].xhely+=4;
}
else egydenever[i].dirx*=-1;
break;
};
switch (egydenever[i].diry) {
case -1:
if (egydenever[i].yhely>0) {
egydenever[i].yhely-=4;
}
else egydenever[i].diry*=-1;
break;
case 1:
if (egydenever[i].yhely<600-egydenever[i].kepe.Height) {
egydenever[i].yhely+=4;
}
else egydenever[i].diry*=-1;
break;
};
};
}
void MainFormPaint(object sender, PaintEventArgs e)
{
for (int i=0; i<3; i++) {
e.Graphics.DrawImage(egydenever[i].kepe,egydenever[i].xhely,egydenever[i].yhely,egydenever[i].kepe.Width,egydenever[i].kepe.Height);
}
}
}
} -
Tomi_78
aktív tag
válasz
Alexios #9343 üzenetére
Szia Alexios!
Köszönöm a választ; ezzel egyúttal azt a kérdésemet is megválaszoltad, hogy kezdőérték nélküli, dinamikus tömböt hogyan lehet létrehozni.
Még javítottam a kódomon annyit, hogy a képe egy változóba kerüljön, tehát:class Deneverek
{
public int dirx,diry;
public Bitmap kepe;
};(...)
if (svsz==0) {
egydenever[i].kepe = deneverkepe1;
} else {
egydenever[i].kepe = deneverkepe2;
};
De ezek után pl. a kirajzolásban nem ismeri fel a képhez tartozó Left és Top változókat:void MainFormPaint(object sender, PaintEventArgs e)
{
for (int i=0; i<3; i++) {
e.Graphics.DrawImage(egydenever[i].kepe,egydenever[i].kepe.Left,egydenever[i].kepe.Top,egydenever[i].kepe.Width,egydenever[i].kepe.Height);
}
}Ez miért van?
És hogy miért pont SharpDevelop? Martonxnek is válaszolva: már régebben a gépemen pihen letöltve és csak most vettem elő. Az tetszett benne annakidején, hogy ingyenes és kicsi: csak letöltöd, kitömöríted és használatra kész. Nem tudom, van-e még ilyen fejlesztőkörnyezet, de nekem egyelőre bejön.Azt viszont én is sajnálom, hogy már nem fejlesztik tovább a készítői.
-
Alexios
veterán
válasz
Tomi_78 #9342 üzenetére
Szia,
Nem teljesen értem a kódodat, ezt valahonnan kimásoltad? A problémák amik előjöttek azért vannak, mert olyan változókat használsz amik nincsenek sehol deklarálva.
Pl. az srcRect és units változókat miért adtad meg a DrawImage-ben, ha nincsenek is ilyenjeid?Az egydenever változót használod minden metódusban, pedig a konstruktorban, mint lokális változó hozod létre. Ha egy metóduson belül hozol létre egy változót, akkor az csak azon a metóduson belül fog élni, máshol nem, ezt javíthatod a kódon belül pl. így:
Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
Deneverek[] egydenever;
majd később már csak ehhez rendelsz értéket:
egydenever = new Deneverek[3];
int svsz;De érdemes lenne első körben a nyelv alapjait is átnézned.
Illetve miért pont SharpDevelop, ami évek óta discontinued állapotban van?
-
Tomi_78
aktív tag
Sziasztok!
Most kezdtem kóstolgatni a C# programozást, és ehhez egy kis grafikus programot írnék SharpDevelop környezetben. Viszont a programom futtatásakor azt írja ki, hogy:
"Az "egydenever" név nem szerepel ebben a környezetben"
illetve a DrawImage-ben a két utolsó paramétert (srcRect és units) nem ismeri, bár nem is tudom, hogy ide miket kéne megadni.
Tudnátok segíteni ennek a két hibajelenségnek a megoldásában? Íme a kódom:using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace Animacios
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
class Deneverek
{
public int dirx,diry,kepe;
};
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//
// TODO: Add constructor code after the InitializeComponent() call.
//
deneverkepe1.MakeTransparent();
deneverkepe2.MakeTransparent();
Deneverek[] egydenever = new Deneverek[3];
int svsz;
for (int i=0; i<3; i++) {
egydenever[i]= new Deneverek();
System.Random vsz = new System.Random();
svsz = vsz.Next(1);
if (svsz==0) {
egydenever[i].dirx = -1;
} else {
egydenever[i].dirx = 1;
};
svsz = vsz.Next(1);
if (svsz==0) {
egydenever[i].diry = -1;
} else {
egydenever[i].diry = 1;
};
svsz = vsz.Next(1);
if (svsz==0) {
egydenever[i].kepe = 0;
} else {
egydenever[i].kepe = 1;
};
};
}
void AnimIdozitoTick(object sender, EventArgs e)
{
for (int i=0; i<3; i++) {
if (egydenever[i].kepe==0) {
egydenever[i].kepe=1;
}
else {
egydenever[i].kepe=0;
};
};
}
void MozgIdozitoTick(object sender, EventArgs e)
{
for (int i=0; i<3; i++) {
switch (egydenever[i].dirx) {
case -1:
if (egydenever[i].Left>0) {
egydenever[i].Left-=4;
}
else egydenever[i].dirx*=-1;
break;
case 1:
if (egydenever[i].Left<800-egydenever[i].Width) {
egydenever[i].Left+=4;
}
else egydenever[i].dirx*=-1;
break;
};
switch (egydenever[i].diry) {
case -1:
if (egydenever[i].Top>0) {
egydenever[i].Top-=4;
}
else egydenever[i].diry*=-1;
break;
case 1:
if (egydenever[i].Top<600-egydenever[i].Height) {
egydenever[i].Top+=4;
}
else egydenever[i].diry*=-1;
break;
};
};
}
void MainFormPaint(object sender, PaintEventArgs e)
{
for (int i=0; i<3; i++) {
if (egydenever[i].kepe==0) {
e.Graphics.DrawImage(deneverkepe1,egydenever[i].Left,egydenever[i].Top,srcRect, units);
}
else {
e.Graphics.DrawImage(deneverkepe2,egydenever[i].Left,egydenever[i].Top,srcRect, units);
}
}
}
}
} -
-
Keem1
veterán
Srácok, Linq segítséget kérnék.
Ez így az objektumot adja vissza:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).Select(ip => ip.ToString()).ToList();
Addig jó, hogy ha lehagyom a végéről a selectet, akkor ugye az eredmény List<IpAddress>, viszont nekem List<string> kellene, de nem az ojjektum nevéről
-
joysefke
veterán
válasz
DrojDtroll #9337 üzenetére
public static int[,] Get4mIntArrBufferedSpan(string fileName)
{
var sw = new Stopwatch();
uint heigth = 2048;
uint width = heigth;
var result = new int[heigth, width];
var buffSize = sizeof(ushort) * heigth;
var buff = new byte[buffSize];
using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize: 1024 * 1024))
{
sw.Start();
for (int w = 0; w < width; w++)
{
int chunk = 0;
while (chunk < buffSize)
chunk += fs.Read(buff, chunk, (int)buffSize - chunk);
var shortArr = MemoryMarshal.Cast<byte, ushort>(buff);
for (int h = 0; h < heigth; h++)
result[h, w] = shortArr[h];
}
sw.Stop();
Console.WriteLine($"{nameof(Get4mIntArrBufferedSpan)} took {sw.ElapsedMilliseconds}ms");
}
return result;
}
Nekem a fenti kód pontosan ugyanazt az eredmény tömböt dobja ki mint a te első metódusod. A különbség annyi, hogy a itt while ciklus megpróbál egyszerre 4096byteot (2048db ushort) kiolvasni a streamből, a kiolvasott byte tömböt castolja ushort-tömbre azzal pedig feltölti egy oszlopodat.
Szóval itt is rossz a tömb bejárási sorrendje, de a Stream.Read() metódus úgy tűnik, hogy ennyivel hatékonyabb, mint egyenként ushortokat olvasgatni. (nálam pontosan duplázódott a sebesség)
A fenti kódban ha a mátrix bejárási sorrendje "normalizálódna" akkor további 3x lenne gyorsabb. ==> tehát igen, itt a processzor fogja vissza a fájlműveletet
Ebben az esetben lenne értelme egyszerre 2048db elemnél többet is olvasni. Az még dobna rajta.
-
-
joysefke
veterán
válasz
DrojDtroll #9334 üzenetére
Igen, én is észrevettem, de szvsz nem a forrásadatokkal van a probléma, hanem a két metódusod nem ugyanazt a bytesorrendet használja, tehát a tömbök tartalma amelyeket visszaadnak sem ugyanaz lesz.
Amikor a második metódusban streamből beolvasol egy ulongot, akkor a ReadUInt64() figyelembe veszi az x86 bytesorrendjét: a változónak a kisebb helyiértékű byteja van alacsonyabb címen (little endian). Ha a streamed sorrendben ezeket a byteoket tartalmazza:
1, 0x01; 2, 0x02; 3; 0x03; 4, 0x04; 5; 0x05; 6, 0x06; 7, 0x07;8, 0x08;akkor a kiolvasott ulong értéke az 0x08'07'06'05'04'03'02'01 lesz, szemben azzal a sorrenddel amit a fileban látsz.
Ha ezt a részt fordított sorrendbe raknád, akkor pont ugyanazt a tömböt adná vissza a kettő metódusod.
result[++j, i] = (ushort)(r >> 48);
result[++j, i] = (ushort)(r >> 32);
result[++j, i] = (ushort)(r >> 16);
result[++j, i] = (ushort)r;
-
joysefke
veterán
válasz
DrojDtroll #9331 üzenetére
for (int i = 0; i < heigth; i++)
{
for (int j = 0; j < width; j++)
{
result[j, i] = reader.ReadUInt16();
}
}
Itt van még egy olyan probléma (mindkét példádban), hogy úgy iterálsz át egy nagy többdimenziós tömbön, hogy a belső ciklusod nem a tömb legjobboldalibb dimenzióján iterál.
C#-ban a többdimenziós tömbök (A[,,,]) row-major ként vannak a memóriában, tehát a legjobb oldalibb dimenzió egymás melletti elemei a memóriában egymás mellett lesznek. az A[100, 50] elem mellett az A[100,51] elem van. Ezzel szemben az A[101,50] az teljesen máshol van, a te esetedben (2048) elemmel később mint az A[100,50], tehát mivel int tömbről van szó, 8KB-tal később van. Az hogy itt csak írsz és nem olvasol kb mindegy, mert nyilván egy egész cache line lesz írva/olvasva.
A helyzeten cache-line szempontből még (valószínűleg) tovább ront itt, hogy kettő hatványonként iterálsz. ilyen problémák nagy mátrixok szorzásánál vannak
-
joysefke
veterán
válasz
joysefke #9332 üzenetére
Uhh az utolsó pontot visszavonom, látom, hogy a belső ciklus 4esével változik növeli a törzsön belül a ciklusváltozót. késő van na
Nyilván segít neki, hogy negyed annyi io van. De igazán jo szvsz akkor lesz ha nagy puffer mellett byte tömböt olvasol be addig amíg van mit olvasni. -
joysefke
veterán
válasz
DrojDtroll #9331 üzenetére
Nincs időm kipróbálni, de nekem egyáltalán nem szimpatikus egy ilyen nagy fájlnak a mini adagokban való szekvenciális olvasgatása.
1, Miért nem a sima stream Read metódussal olvasol azonnal byte[] tömbbe?
2, Én megpróbálnám a bufferméreteket manuálisan feljebb húzni. Alapból csak valami ici-pici bufferekkel dolgozik. (nekem pár 10KB rémlik)
3, Nem mintha itt számítania kellene de te itt ugye 4M elemen iterálsz át egy szoros for () ciklusban => ha nem fájlműveletet végeznél, akkor már ez is bizonyos helyzetekben indokolatlanul lassú (4M tömbhatár ellenőrzés az indexerekre+ ellenőrzés az iterátoron, szerk: mondjuk 4M az még nem túl sok..)
(4, miért int tömbben-ben tárolod a short értékeidet?)5, a két kód ránézésre nem ugyanazt csinálja. a második konkrétan elcseszettnek tűnik.
64bitenként olvasol és ugyanúgy 4M-szor mint amikor 16 bitenként olvastál???? -
DrojDtroll
veterán
Sziasztok!
Van sok 8MB-os fájlom, amit szeretnék feldolgozni. A fájlok pontosan 2048x2048 db előjel nélküli két byte-os egész számot tartalmaznak binárisan.
Az első megoldásban két for ciklus segítségével olvastam be 16 bitenként. Próbaként megpróbáltam 64 bitet beolvasni és biteltolással előállítani a 64 bites számból a 4db 16 biteset. Úgy néz ki ez a módszer kb. kétszer olyan gyors mint a 16 bites.
Különböző tömböket kapok és nem tudom hol a hiba.
Mi okozza a különbséget?
-
petyus_
senior tag
válasz
kiskornel #9324 üzenetére
Ahogy a többiek is írták, a logger-be nem kéne ilyen logikát rakni, annak már csak azt az adatot kellene átadnod, ami a logba kerül.
"A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni."
Ha mégis így akarod, akkor a params-t használd, ahogy korábban írtam:
Method(int x, params object[] obj){}
Itt nem kell létrehoznod semmilyen tömböt, vesszővel elválasztva pakolhatod be a paramétereket, utána a függvényen belül viszont a tömb elemein kell végigmenned. -
joysefke
veterán
válasz
kiskornel #9324 üzenetére
Vannak loggoló frameworkok, pld "Serilog". https://github.com/serilog/serilog/wiki/Getting-Started#example-application
Itt egy videó https://www.youtube.com/watch?v=ljZpWbuK68s
A loggolás pedig ennyi:
catch (Exception ex){
Log.Error(ex, "Something went wrong. Részletek: {param1} {param2} {param3}", param1, param2, param3);
}
Ha nem teljesítmény kritikus az applikáció akkor a fenti séma jó is...
mindent átguglizok
abból semmit nem lehet tanúlni
-
sztanozs
veterán
válasz
kiskornel #9324 üzenetére
Log fájlba az alábbi dolgok kellenek:
- esemény ideje (UTC vagy timezone megadásával)
- esemény szintje (amennyiben szükséges)
- esemény típusa (és/vagy azonosítója)
- esemény forrása (és vagy forrás azonosítója)
- esemény sikeressége (ha típus szinten ezt nem különítjük el)
- esemény üzenetTehát egy logoló kódba nem kell beledobálni mindenféle objektumokat. Azt vagy egy előre definiált esemény-objektummal kell feltölteni, vagy szöveges mezőket megadni.
-
kiskornel
addikt
válasz
joysefke #9323 üzenetére
Köszönöm a válaszokat. A cél egy log fájl írása lenne. Bárhol a progiban ahol Catch ágra fut, ott meg kellene hívnom egy errorlog függvényt, aminek az első paramétere, egy int (hol száll el) ... ez tiszta. DE...
A eset: a második paraméter meg mondjuk egy string (név) , harmadik egy int (ciklusszámláló).
B eset: a második paraméter egy WebClient (maga az objektum), harmadik param. egy webclient response (a válasz, amit ad), negyedik egy string (URL, ahonnan meg lett az hívva).
C eset: stb...Tehát a paraméterek száma is változik (gondolom optional kell legyenek az elhagyható paraméterek) és még a típusuk is változik össze vissza. A függvény belülről nem gond, a típusazonosítás után már fel lehet dolgozni, de nem akarok tömböt definiálni, mikor hívom a függvényt, csak a paramétereket zárójelben bepakolni, átadni.
Az átadott paramétereket meg szétbontom, formázom, és kiírom a log fájlba.
Csak tanulás céljából kérdezem, mert túl sok macera, meg lehet kerülni, máshogy kivitelezni. (meg mert így szokták a nagyok).
Lenne kérdésem a válaszokkal kapcsolatban is, de ha felteszem, tutti elviszi a témát.
Még1x köszönöm a válaszokat, mindent átguglizok.
-
joysefke
veterán
válasz
kiskornel #9319 üzenetére
szvsz:
-(A) vagy több overloadolt függvény dekalrációt használsz ugyanazzal a függvénynévvel, de különböző paramétertípusokkal , e.g.: void A (int, string, string); void A (int, object, object);
-(B) vagy egyszerűen object-ként deklarálod a különböző bemenő paramétereket és bent egy type-matching switch statementel eldöntöd a konkrét típust.-(C) gondolom tisztában vagy a generikus típus/metódusdeklaráció mikéntjével és nem erre lenne igazából szükséged:
pldpublic int Foo<T1,T2,T3>(int x, T1 p1, T2 p2, T3 p3){
Console.WriteLine($"{p1.GetType()} {p2.GetType()} {p3.GetType()}");
return x;
}
-
fatal`
titán
válasz
kiskornel #9319 üzenetére
Attól függ mit szeretnél, C#-ban nincs union type. Ha csak kiírni ToString()-gel, akkor a #9320-ban említettek is megfelelőek lehetnek.
Lehet több overloadot csinálni (persze 5 paraméternél ez baromi sok lenne), vagy pedig builder patternre (vagy ahhoz hasonlóra) lehet szükséged, bár ez konstruktornál hasznos.
Akár típusra pattern matching is játszhat.
A cél nélkül nehéz megmondani
-
sztanozs
veterán
-
kiskornel
addikt
Sziasztok!
Adott egy függvényem, aminek az első bemenő paramétere int, viszont a 2. már lehet string, int, vagy objektum... a 3. 4. 5. paraméter szintúgy különböző típusok lehetnének.Azt vágom, hogy kell később vizsgálni, hogy milyen típus, de hogy kell a függvény paramétereit leírni, hogy híváskor elfogadjon akár számot, akár stringet, akár objektumot?
Előre is köszi
-
martonx
veterán
Szia, így kell .net core-t service-ként linuxon futtatni: https://swimburger.net/blog/dotnet/how-to-run-a-dotnet-core-console-app-as-a-service-using-systemd-on-linux
-
Keem1
veterán
válasz
joysefke #9316 üzenetére
Nem, dehogyis, nyitottam a solution-ön belül egy teljesen új .Net Core 3.1-es projectet, a már létező .Net 4.5-ös console és az ugyancsak 4.5-ös service mellé.
A service pojecten belül még van 4 db class-em, amik a tényleges munkát végzik, úgy vannak megírva, hogy ne függjenek az adott projecttől (példa: Ac, Bc, Cc, Dc, ezek a class-ek más-más feladatot csinálnak). A service is és a console is ugyanezeket használja.
A console pl. nem tartalmaz mást, mint 4 db szöveges menüpontot, az 1, 2, 3 és 4 gomb lenyomására voltaképp a fenti class-ek[Ac|Bc|Cc|Dc].Run()
nevű metódusát hívják meg és végrehajtják.
A service is voltaképp ugyanezt csinálja, csak időzítetten, mint egy crontab, megadott időben azAc.Run()
,Bc.Run()
, stb hívogatódik, de emellett persze mást is: compactolja az SQLite-ot, futtatja a mini webservert, backupolja a MySQL és az SQLite db-ket.Az eredeti elképzelés az volt, hogy a kettő egyben lenne (service-ként, amit a --console argumentummal lehet "menüsíteni"), Windows alatt simán működik is amúgy, alapvetően a --console arggal simán bedobja a console menüt, ketté is van választva a Main() (
if (--console) RunConsole(); else RunService();
), ez Windows alatt csodásan működik, de a Linux közli, hogy service programot csak service-ként lehet futtatni. Végül a Linux miatt készült egy pár soros Main()-ből álló console verzió is, aminek a tartalma a megírás óta nem változott (ahogy említettem, a menüt futtatja), de igazából a service Main()-je sem... hisz minden abban a 4 db class-ben módosul/frissül.Tehát, összegezve... van egy 4 db classből álló feladatcsomagom, amik a Raspberry Pi-n különböző feladatokat hajtanak végre. Emellett van egy console app, ami mauálisan ezeket a feladatokat futtatja, Win/Linux egyaránt. Van egy service-m, ami szintén ezeket futtatgatja, de időzítve, plusz a webes elérést biztosító webserver, plusz pár backup és hasonlók, minden olyasmi, amit egy állandóan a háttérben mozgó service kell hogy futtasson.
-
joysefke
veterán
Net api analyzer. Keress rá, rakd fel a VSre és futtasd le mindenféle net standard és net core targetekre, compatibility pack opcióval és anélkül.
Egyébként mit csináltál? Átraktad a target frameworkot 4.5 ről netcore 3.1 re és most futási időben kapsz hibát? Hogyan futtattad ezt eddig linuxon?
Amikor átállítottad a target frameworkot, akkor kellett compatibilitás csomagot feltenni?
-
Alexios
veterán
Hát, elég egyértelmű az exception
.NET Core 3-al bekerültek olyan api-k is, amik nem platformfüggetlenek. Pl. WPF kódot lehet .NET Core 3-al írni, de ettől még nem fogod tudni linuxon futtatni, ha tippelnem kéne akkor a System.ServiceProcess is ilyen[link]
Szerintem ezt a linket nézd meg, itt jó eséllyel találsz megoldást -
Keem1
veterán
Ok meggyőztetek. Viszont elakadtam, még egy egyszerű tutorial se megy. Windowson oké, Linuxon nem. Mutatom, légyszi segítsetek.
Úgy néz ki, hogy a kis projektem minden egyéb eleme megy Linuxon is, csak a service nem működik. Amúgy tök jó ötlet volt megszabadulni 41 warningtól (unused variable) meg kikukáztam pár, már sehol nem használt metódust is
Valahogy ezt a nyamvadt service-t kéne megszülni. Az átoperálás után Windowson az eredeti service .Net Core 3.1-en is megy, és megy az alábbi példa is. Linuxon egyik se.
Ja, és console appként Linuxon is kiválóan megy, az SQLite is
Csak a service nem...Eredmény Linuxon ( .Net Core 3.1)
Unhandled exception. System.PlatformNotSupportedException: ServiceController enables manipulating and accessing Windows services and it is not applicable for other operating systems.
at System.ServiceProcess.ServiceBase..ctor()
at Testing.LoggingService..ctor()
at Testing.Program.Main(String[] args) in E:\..\Program.cs:line 39
Félbeszakítva -
joysefke
veterán
Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?
Én inkább úgy fogalmaznék, hogy ha valami 3rd party packaget használsz, akkor ha az nincsen .Net Standard-re (lehetőleg max 2.0-ig) akkor az felejtős. Ha van, akkor az jó, mert egy esetleges net framework => net core át-targetelésnek nem fog útjában állni.Én semmilyen körülmények között nem használnék olyan 3rd party libet ahol nem látom azt, hogy az arra épülő kódomat át tudom változtatás nélkül emelni akkor is ha futtatókörnyezetet váltok alatta. (lépek frameworkről 4.X-ről Core-ra)
Ezzel párhuzamosan ha kódot írok próbálom úgy szervezni, hogy közvetlenül framework 4.x-et targetelő projekt(ekbe) minél kevesebb kerüljön és inkább átcsoportosítom olyan projektekbe amelyek netstandard2.0-át targetelnek.
-
Alexios
veterán
A .NET fw 4.8-al véget ért, security patchek érkeznek hozzá egy darabig, és kész. Idén jön a .NET 5, az már a core-ra épül, ez a jövő
Inkább pont fordítva, mi értelme .net fw-ben egy új projektet kezdeni?(főleg 4.5-ben)Ráadásul ha linuxon is akarsz .net-et futtatni, eleve nem látom értelmét mással kezdeni, mint az ott natívan támogatott .net core-al
-
Keem1
veterán
válasz
martonx #9306 üzenetére
Nem, Linuxon nem ezt a path-t használtam
Viszont megvan a hiba, nem a Microsoft.Data.Sqlite.Core kell, hanem a Microsoft.Data.Sqlite. Úgy műxik.
Vannak névkonvencióbeli eltérések a hivatalos verzió és a Microsoft sajátja között, azt már észrevettem. Na de ez a hülyeség, hogy nem mondhatom meg, hogy a DB-m milyen verziójú, ez nonszenszDe úgy tűnik, ezzel tényleg működik ARM alatt.
No offense, de ha már itt tartunk. Mi az a fő indoka annak, hogy a(z elvileg még maintained) .Net xxx használata eretnekségnek minősül, és ami nincs Core alatt, az felejtős? Tehát mi az az ok, ami miatt a Core mindenképp használandó, más meg kerülendő?
Én úgy tudtam, az adott programnyelv, környezet csak egy eszköz, semmiképp sem határozza meg a végtermék minőségét. Akár lyukkártyával is megoldhatnám az adott feladatot - más kérdés, hogy meg tudom-eIgen, tudom, a Core eleve opensource-nak, végre platformfüggetlennek készült (más kérdés, hogy eredetileg a .Net is, a Java babérjaira akart törni a 2000-es évek elején), de miért gáz jelenleg .Net-et használni helyette, ha egyébként tökéletesen működik és fejlesztik is?
-
martonx
veterán
Gyors Guglizás után a version keyword nem támogatott Microsoft.Data.Sqlite.Core alatt függetlenül az operációs rendszertől, más kérdés, hogy Linux alatt szerintem eleve helytelen útvonal az F:\chinook.db
Helyette Mode=ReadOnly kell a connectionstringbe? -
martonx
veterán
Ne mondd már: https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/3.1.8
Talán 2-3 évvel ezelőtt ez igaz is lehetett, manapság ami nincs .Net Core-hoz, azzal nem is érdemes foglalkozni. -
Keem1
veterán
válasz
Alexios #9301 üzenetére
Köszönöm a tanácsot, de úgy néz ki, ez is elfailel, bár ez más miatt.
Már akkor elkezdtem ijedezni, mikor még Windows alatt is belebotlott a bicskája a connection stringben átadott "version" paraméterben, aminek eddig sem PHP, sem .NET 4.5, sem Java alatt nem volt baja
Ez az én kis teszt kódom SQLite teszteléshez:
using (SqliteConnection conn = new SqliteConnection($@"Data Source=F:\chinook.db;Version=3"))
{
conn.Open();
using (SqliteCommand cmd = new SqliteCommand("SELECT `name` FROM sqlite_master WHERE type='table';", conn))
{
SqliteDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
System.Console.WriteLine(reader.GetString(0));
}
}
}
És Linux alatt ezt kaptam:
Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 14: 'unable to open database file'.
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
at Microsoft.Data.Sqlite.SqliteConnection.Open()
at Program.Main(String[] args) in ...\Program.cs:line 24 -
Keem1
veterán
válasz
joysefke #9302 üzenetére
Köszönöm. ezt kipróbálom
"élesben nyilván a console.Readkey helyett valami olyan szerver metódusod lesz, ami sosem ér véget, ezáltal a backgroundban futó futó webservice is életben marad"
Igen, ezt nagyon jól látod, a solution-ön belül két projectem van, a service, meg egy CLI verzió, próbálom mindkettőt életben tartani, mindkettőt tovább vinni. A CLI alapvetően teszteléshez, debuggoláshoz kell, amit bemásoltam, az onnan való, a service másképp működik.
Sematikusan:
---- Service (project)
---------- servicemethods.cs
---------- program.cs
---- CLI (project)
---------- program.cs (<--- servicemethods.cs)Itt válnak ketté
Windows alatt a service-t lehet CLI-ként is futtatni, sajnos Linux alatt nem.
Ha Linux alatt futtatom, ezt kapom:Use mono-service to start service processes
Ezért fordítok egy második exe-t is, ami gyakorlatilag a paraméterek alapján hívogatja a fő class motyóit. A két program.cs pedig ezeket használja. Az egyik serviceként a másik pedig programként.
#region Service class
public class Service : ServiceBase
{
public Service()
{
ServiceName = Program.ServiceName;
}
protected override void OnStart(string[] args)
{
Program.OnStart(args);
}
protected override void OnStop()
{
Program.OnStop();
}
}
#endregion
#region Main method, application's entry point
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
AppInfo.UseLocalDatabaseFolder = true;
if (System.Environment.UserInteractive)
{
ics.logger.Info("Run as application");
bool showMenu = true;
while (showMenu)
{
showMenu = ConsoleApp.MainMenu();
}
}
else
{
ics.logger.Info("Run as service");
using (var service = new Service())
{
ServiceBase.Run(service);
}
}
}
#endregion -
joysefke
veterán
A Task-on már én is agyaltam, de amikor próbálkoztam, valahogy nem jött össze.
Tessék, ez így működik, gyakorlatilag semmit sem változtattam azon amit bemásoltál. (net framework 4.7.2 + ASP net core 2.1)
A Console.Readkey(). tartja életben a main thredet, az pedig közvetve a webservice-t. élesben nyilván a console.Readkey helyett valami olyan szerver metódusod lesz, ami sosem ér véget, ezáltal a backgroundban futó futó webservice is életben marad.
szerk (ne az IIS profillal futtasd)
public class Program
{
static Task _webService;
public static async Task Main(string[] args)
{
Debug.WriteLine("WebGUI Teszt");
_webService = StartWebGui();
Console.ReadKey();
}
static async Task StartWebGui()
{
var hostBuilder = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.UseUrls("http://localhost:808/")
.Build();
await hostBuilder.RunAsync();
}
}
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Xbox Ultimate előfizetések
- MacBook felvásárlás!! Macbook, Macbook Air, Macbook Pro
- BESZÁMÍTÁS! Gigabyte A520 AORUS R5 5500 16GB DDR4 512GB SSD RX 6600 XT 8GB Rampage SHIVA TT 500W
- Laptop felvásárlás , egy darab, több darab, új , használt ! Korrekt áron !
- ÖRÖK GARANCIÁVAL - OLCSÓ, LEGÁLIS SZOFTVEREK 0-24 KÉZBESÍTÉSSEL - Windows - Office - LicencAruhaz.hu
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest