» »

C# BackgroundWorker Class problem

C# BackgroundWorker Class problem

Senzacionale ::

private void btnStartCurrencyConverter_Click(object sender, EventArgs e)
        {
            if (!bwCrawler.IsBusy)
                bwCrawler.RunWorkerAsync();
        }

        private void CurrencImport()
        {
            CurrencyWS.CurrencyConvertorSoapClient client = new CurrencyApp.CurrencyWS.CurrencyConvertorSoapClient();

            string[] curr1 = Enum.GetNames(typeof(CurrencyWS.Currency));
            string[] curr2 = Enum.GetNames(typeof(CurrencyWS.Currency));
            int i = 0;
            int j = 0;
            int k = 0;

            foreach (var c1 in curr1)
            {
                foreach (var c2 in curr2)
                {
                    try
                    {
                        CurrencyWS.Currency cEnum1 = (CurrencyWS.Currency)Enum.Parse(typeof(CurrencyWS.Currency), c1);
                        CurrencyWS.Currency cEnum2 = (CurrencyWS.Currency)Enum.Parse(typeof(CurrencyWS.Currency), c2);
                        double rate = client.ConversionRate(cEnum1, cEnum2);

                        ICurrenciesDao currenciesDao = DaoFactory.GetCurrenciesDao();

                        Currencies currencyExist = currenciesDao.GetConversionRateByFromCurrencyToCurrency(c1, c2);

                        if (currencyExist != null)
                        {
                            // update if row exist
                            currencyExist.ConversionRate = Convert.ToDecimal(rate);
                            currenciesDao.SaveOrUpdate(currencyExist);
                            currenciesDao.CommitChanges();

                            lblNumberOfUpdatedRows.Text = i.ToString();
                            i++;
                        }
                        else
                        {
                            // write new row
                            Currencies currencyNew = new Currencies(c1, c2, Convert.ToDecimal(rate), DateTime.Now);
                            currenciesDao.Save(currencyNew);

                            lblNumberofNewRows.Text = j.ToString();
                            j++;
                        }

                        txtStatus.Text = c1 + " " + c2 + ": " + rate;
                    }
                    catch
                    {
                        lblNumberofErrorRows.Text = k.ToString();
                        k++;
                    }
                }
            }
        }


in sedaj BackgroundWorker kliče DoWork metodo

private void bwCrawler_DoWork(object sender, DoWorkEventArgs e)
        {
            CurrencImport();
        }


ampak dobim napako Cross-thread operation not valid: Control 'lblNumberofErrorRows' accessed from a thread other than the thread it was created on.

Z googlom si ne morem nekam pomagati ker ne vem kako asinhrono potem klicati metodo da vmesnik ne zmrzne...
http://www.dostavahrane.si
  • spremenil: Senitel ()

hendriks ::

Forma (in vsi gradniki na njej: lblNumberofErrorRows) ti laufa v svojem threadu, ti pa hočeš klicati labelo iz drugega threada,
zato ti javi error. Jaz bi naredil tako, da bi kreiral class spremenljivko/property (npr. string m_NumberOfErrorRows) in ji v catch bloku assignal k.ToString().
Potem pa bi v BGW eventu Completed (ko se ta event izvede, si že v primarnem thread-u), assignal lblNumberofErrorRows.Text = m_NumberOfErrorRows.
Takole na pamet :)

Senzacionale ::

super, bom probal sedajle, hvala ...
http://www.dostavahrane.si

Senzacionale ::

še 1 vprašanje, sedaj ne javlja napake samo na zaslon nič ne izpiše ker se zanka vedno izvaja in do BGW eventu Completed sploh ne pride. Kje moram postavit BGW da bo za vsak uspešen zankin cikler tudi na zaslon izpisalo rezultat?

Če kličem v DoWork kar celo CurrencImport metodo v posameznih zankinih korakih ne izpisuje nič...

private void bwCrawler_DoWork(object sender, DoWorkEventArgs e)
{
CurrencImport();
}
http://www.dostavahrane.si

hendriks ::

Na googlu imaš 1001 primer tega :)

Senzacionale ::

hja probal sem že 4 pa noben mi ne dela, maš kak link kjer sigurno dela, zato sem v 1 postu napisal da kar probal od googla ne dela mi nič?
http://www.dostavahrane.si

hendriks ::

http://www.danielmoth.com/Blog/2004/12/...

Tole poglej. Fora je, da kličeš ReportProgress metodo, ki ti proži ProgressChanged event, v tem
eventu pa potem lahko update-aš oz. izpisuješ kar se ti dogaja sproti. Poglej si še msdn dokumentacijo.


Vredno ogleda ...

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

[ASP.NET] Prenos podatkov iz ene spletne strani v drugo

Oddelek: Programiranje
14950 (809) Cvenemir
»

[C#,SQL]

Oddelek: Programiranje
51257 (1170) JanOlMajti
»

C# - xml import v bazo

Oddelek: Programiranje
71473 (1291) nuclear
»

visual basic 2008 express edition

Oddelek: Programiranje
221826 (1253) sel
»

ASPX preusmeritvena zanka

Oddelek: Programiranje
52125 (2030) Senzacionale

Več podobnih tem