Čekání na konec aplikace kvůli COM portu [C#]   otázka

C#, Hardware

Zdravím, mám takový problém, že mi aplikace při ukončení čeká na uzavření COM portu. COM port se otevírá během spuštění aplikace a na konci (během metody Dispose) volám funkci, která ukončuje a uzavírá COM port.

            if (teplomerPort != null)
            {
                teplomerPort.DataReceived -= teplomerPort_DataReceived;
                myDelegateTemperatureReceived = null;

                if (teplomerPort.IsOpen)
                {
                    while (teplomerPort.BytesToRead > 0)
                        teplomerPort.DiscardInBuffer();

                    while (teplomerPort.BytesToWrite > 0)
                        teplomerPort.DiscardOutBuffer();

                    teplomerPort.Close();
                }

                if (teplomerPort != null)
                    teplomerPort.Dispose();

                temperatureValue = 0;
                teplomerPort = null;

Aplikace se někdy zasekne v kroku teplomerPort.Close() a jediný způsob jak ji ukončit je pomocí stopnutí debug ve Visual Studiu. Nemáte s tím někdo zkušenosti?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

​Jen pro doplnění:

1.) Stejný problém se projevuje i na ostatních COM portech

2.) Když se ve VS podívám, kde zrovna program čeká, tak mi to hlásí, že čeká v kroku, kde se uzavírá port.

3.) Když se podívám na stav portu, tak mi VS ve watch tabulce hlásí: "Cannot evaluate expression because the current thread is in a sleep, wait, or join"

4.) Pro příjem dat využívám event DataReceived

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky tomu popisu, že dané vlákno je uspáno nebo čeká na ukončení jiného vlákna mne napadlo, že to může být tím příjmem dat pomocí eventu, tak jsem do eventu přidal následující podmínky.

            try
            {
                if ((this != null) && (myDelegateInputsReceived != null))
                {
                    if (this.Controls.Count > 0)
                    {
                        this.Invoke(myDelegateInputsReceived);
                    }
                    else
                    {
                        beckhoffPort.DiscardInBuffer();
                    }
                }
                else
                {
                    beckhoffPort.DiscardInBuffer();
                }
            }
            catch
            {

            }

Toto jsem udělal u všech eventů pro COM porty. Od té doby se tato chyba zatím neprojevila.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak chyba se stále projevuje. Neměl by někdo nějaký nápad, čím by to mohlo být?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už vím co se stalo ... jedná se o deadlock ...

viz odkazy:

http://social.msdn.microsoft.com/forums/...

https://connect.microsoft.com/VisualStud...

http://blogs.msdn.com/b/anthonywong/arch...

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback