Avatar
Honza
Člen
Avatar
Honza:

Ahoj, vytvářím si v C# třídu pro import dat z excelu. Můj požadavek je ten, že třídě předám cestu k souboru a název listu (nebo jeho pořadové číslo) a třída mi vrátí data ve formě datatable. Pro načítání dat samotných používám closedXML. Potud vše ok, funguje to bez problémů. Vzhledem k tomu že jen volám funkci která vrací data (třída v sobě nemá žádné proměnné nebo vlastnosti) označil jsem třídu jako static (příjde mi zbytečné vytvářet vždy novou instanci). Ale napadlo mě, bude tato třída thread safe? Zkoušel jsem to testovat a všechno vypadá ok, ale stejně.

Implementace je následující:

public static class ExcelUtil
{

        // Import podle názvu listu
        public static DataTable ImportDataFromFile(string fullPath, string sheetName)
        {
            XLWorkbook workbook = new XLWorkbook(fullPath); // otevření sešitu
            IXLWorksheet worksheet = workbook.Worksheet(sheetName); // získání listu
            return ImportData(worksheet); // import dat
        }


        /// Import podle pořadového čísla listu
        public static DataTable ImportDataFromFile(string fullPath, int sheetPosition)
        {
            XLWorkbook workbook = new XLWorkbook(fullPath); // otevření sešitu
            IXLWorksheet worksheet = workbook.Worksheet(sheetPosition); // získání listu
            return ImportData(worksheet); // import dat
        }


        // Samotný import dat
        private static DataTable ImportData(IXLWorksheet worksheet)
        {
            DataTable result= new DataTable(); // vytvoření výsledné datatable
            IXLRange dataRange = worksheet.RangeUsed(); // získání oblasti dat

            // zde plním datatable daty
            // ...
            // ...

            return result=
        }

}

Napadlo mě totiž zda nemůže nasta problém při zavolání privátní metody ImportData které předávám sešit. Zda se to v tuto chvíli nemůže teoreticky "promíchat". Že by metoda vrátila výsledek který by náležel jinému vláknu a naopak. Situaci kdy by se více vláken pokoušel číst z jednoho souboru můžeme v tuto chvíli zanedbat.

Díky za názory

Editováno 24. října 12:18
Odpovědět 24. října 12:17
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Petr Čech (czubehead):

Nepřistupuje k žádným proměnným, takže je thread-safe ;)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  -1 24. října 18:32
Why so serious? -Joker
Avatar
Honza
Člen
Avatar
Odpovídá na Petr Čech (czubehead)
Honza:

Přesně tohle jsem chtěl slyšet, děkuji ;)

Nahoru Odpovědět 24. října 21:28
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Marian Benčat:

ja bych byl asi ohledne toho tvrzeni opatrny.. ja tam vidim praci se soubory.. To,, ze je trida statická neříká nic o tom, jestli je thread safe, nebo není.. stejně tak ani to, zda přistupuje, nebo nepřistupuje k nějakým proměnným..

Tady bych odpověděl tak, že ta třída je thread safe, pokud to co se používá uvnitř je thread safe ;-)

 
Nahoru Odpovědět 25. října 0:05
Avatar
Honza
Člen
Avatar
Odpovídá na Marian Benčat
Honza:

Díky za reakci :) Ohledně těch souborů, jak jsem psal zanedbal bych případ kdy se dvě vlákna pokoušejí přistupovat k jednomu souboru, protože tam mi je jasný že to musím ošetřit nějak jinak. Jde mi vyloženě o tu třídu, abych se mohl spolehnout že se mi nevrátí data z jiného souboru než očekávám.

Nahoru Odpovědět 25. října 8:07
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Honza
Marian Benčat:

a to je právě ono.. nejde jen o soubory.. jde o to, jestli treba vyvojar te knihovni neni mental a nepouziva tam treba singleton jako antipattern..

Todle bohužel nemáš šanci moc zjsitit a musíš do dokumentace knihovni zjistit, jeslti je threadsafe.. Coz z toho kodu by byt mela,.. ale proste nikdy nevis, co programator vymyslel.. staci tak malo, aby to thread safe nebylo.

 
Nahoru Odpovědět 25. října 14:54
Avatar
Odpovídá na Marian Benčat
Petr Čech (czubehead):

To, že nelze přistupovat z více objektů/metod a pod. k souboru nemá nic společného s tím, jestli je to thread-safe. Zkrátka se jedná o rozličné pojmy. Thread-safe znamená, že nedojde k žádným neočekávaným vnitřním chybám v důsledku např. toho, že není nějaká operace atomární ačkoliv by měla. To, že vyhazuje jiné zcela legitimní vyjímky se do toho nepočítá.

Editováno 25. října 15:57
Nahoru Odpovědět 25. října 15:55
Why so serious? -Joker
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

já neřekl ani slovo o souboru. Stačí aby nějaká knihovna co on používá, používala nevhodně singleton a je hotovo.

 
Nahoru Odpovědět 26. října 0:04
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

ah tak ano.. v prvnim prispevku jsem bohuezl nestastne pouzil priklad se soubory.. OK, zapomente na soubory. To s tim nesouvisi.
//3rd party
class Foo() {
static int counter = 0;
public getCounter() => Foo.counter;
public increment() => Foo.counter++;
}

Moje "thread safe knihovna"
//kod spusteny ve vice threadech.. nepredavaji se zadne parametry, vytvari se nova instance Foo, ktera neni sdilena.
var a = new Foo();
for(;;) {
a.Increment();
console.write­line(a.getCou­nter());
}

Presto ocividne neni kod threadsafe

 
Nahoru Odpovědět 26. října 0:19
Avatar
Marian Benčat
Redaktor
Avatar
 
Nahoru Odpovědět 27. října 1:07
Avatar
Odpovídá na Marian Benčat
Petr Čech (czubehead):

Stále nevidím problém v tom původním kódu, ty tam máš statickou proměnnou counter, a ta třída zcela určitě thread-safe není, ale Honza nedělá...

Nahoru Odpovědět 27. října 13:48
Why so serious? -Joker
Avatar
Honza
Člen
Avatar
Honza:

Abych se vrátil k mé třídě. Pokud není knihovna třetí strany kterou používám thread safe, tak moje třída není thread safe, to je celkem jasné. Ale pokud to chápu dobře, tak v tomto případě by na tom nemuselo mít vliv to, jestli je moje třída statická nebo ne. Protože pokud je v použité knihovně používán např. singleton, budu mít stejný problém se statikou i bez ní.

Nahoru Odpovědět 27. října 13:50
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Honza
Marian Benčat:

@czubehead honza, ne - ale treba ta knihovna co on pouziva ano. Cele co chci rict je to, ze knihovna je threadsafe POUZE (nutne - ne dostacujici pravidlo), pokud jsou knihovny které používá také thread safe.. Tedy z toho kódu co poskytl nelze na 100% říci, že je to thread safe, pokud nemá v dokumentaic napsáno "TATO KNIHOVNA JE THREADSAFE".

A to už tu vůbec nemluvím o něčem složitějším typu ConfigureAwait() u knihoven..

Nechme to být...

Honza:
Presne tak.. Pokud mam odpovedet na otazku v nazvu:
C# - Je statická třída thread safe

Tak odpovím, že na to takto nelze odpovědět.

 
Nahoru Odpovědět 27. října 14:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.