Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Cross-thread exception - pojawia się tylko czasami mimo Invoke

2 views
Skip to first unread message

bodziec

unread,
Dec 8, 2009, 3:11:29 AM12/8/09
to
Witam,
Mam następujący problem:

W funkcji Main jest uruchomiony BackgroundWorker w którego DoWork
wykonywane jest
pokazanie formatki oraz wykonanie jakiejś długiej operacji na bazie
danych.
Na formatce jest też timer na którego cyknięcie jest ustawiona zmiana
tekstu labela
zeby zrobic jakby animacje obracajacej sie kreski czyli | / - \ | / -
\

niestety taki kod:

private delegate void SetTextDelegate(string Text);
private void SetText(string Text)
{
if (Napis.InvokeRequired)
Napis.BeginInvoke(new SetTextDelegate(SetText), Text);
else
Napis.Text = Text;
}

obsługujący wykonanie zmiany tekstu labela powoduje czasami wyrzucenie
wyjątku Cross-thread operation

wyjatek ten wyrzucany jest losowo czyli czasami sie pojawia a czasami
nie
tzn wg mnie losowo bo tak naprawde pewnie jest to od czegos zalezne
tylko kurde nie mam pojecia od czego

wyglada tak jakby wchodził w else mimo że Napis jest InvokeRequired

Proszę o pomoc co może być przyczyną takiego zachowania

Łukasz 'Maly' Ostrowski

unread,
Dec 8, 2009, 3:31:16 AM12/8/09
to
On Tue, 8 Dec 2009 00:11:29 -0800 (PST), bodziec wrote:

> <snip>

> niestety taki kod:
>
> private delegate void SetTextDelegate(string Text);
> private void SetText(string Text)
> {
> if (Napis.InvokeRequired)
> Napis.BeginInvoke(new SetTextDelegate(SetText), Text);
> else
> Napis.Text = Text;
> }
>

> obs�uguj�cy wykonanie zmiany tekstu labela powoduje czasami wyrzucenie
> wyj�tku Cross-thread operation

Gdzie jest pasuj�cy EndInvoke? Nie powinno by� tam przypadkiem Invoke ;-)?

--
Pozdrawiam,
�ukasz 'Maly' Ostrowski. http://l3v.pl/

GrzybSon

unread,
Jan 9, 2010, 10:05:09 AM1/9/10
to
Do�� cz�sto korzystam z w�tk�w w C# i robi� to tak:
1. w�tek umieszczam w jakiej� zewn�trznej klasie (BackGroundNapisWorker) i
wystawiam publiczne zdarzenie
np. InfoFromThreadEventHandler
2. w formie powo�uj� instacje tego obiektu, zapisuj� si� na zdarzenie
wystawione w klasie i staruj� w�tek.

procedura wykonywana na wyst�pienie zdarzenia OnInfoFromWorker b�dzie
wygl�da�a z grubsza tak:
//----------------------------------------------------------------------------------
void SetText(string Text)
//----------------------------------------------------------------------------------
{
if (this.InvokeRequired)
{
this.Invoke(new InfoFromThreadEventHandler(SetText), new
object[] { Text });
}
else
{
Napis.Text = Text;
}
}

ta procedurk� trzeba doda� do klasy formy zawieraj�cej napis.

--
Pozdro,
Ma�ko
U�ytkownik "bodziec" <bod...@gmail.com> napisa� w wiadomo�ci
news:3b5948ec-6c42-4c09...@k17g2000yqh.googlegroups.com...
Witam,
Mam nast�puj�cy problem:

W funkcji Main jest uruchomiony BackgroundWorker w kt�rego DoWork
wykonywane jest
pokazanie formatki oraz wykonanie jakiej� d�ugiej operacji na bazie
danych.
Na formatce jest te� timer na kt�rego cykni�cie jest ustawiona zmiana


tekstu labela
zeby zrobic jakby animacje obracajacej sie kreski czyli | / - \ | / -
\

niestety taki kod:

private delegate void SetTextDelegate(string Text);
private void SetText(string Text)
{
if (Napis.InvokeRequired)
Napis.BeginInvoke(new SetTextDelegate(SetText), Text);
else
Napis.Text = Text;
}

obs�uguj�cy wykonanie zmiany tekstu labela powoduje czasami wyrzucenie
wyj�tku Cross-thread operation

wyjatek ten wyrzucany jest losowo czyli czasami sie pojawia a czasami
nie
tzn wg mnie losowo bo tak naprawde pewnie jest to od czegos zalezne
tylko kurde nie mam pojecia od czego

wyglada tak jakby wchodzi� w else mimo �e Napis jest InvokeRequired

Prosz� o pomoc co mo�e by� przyczyn� takiego zachowania

0 new messages