Ostatnio kolega zaczął się interesować kwestią wątków w C# i co logiczne znalazł sobie stronkę na microsoftowym suppporcie. Jednak problem polega na tym, że kod w wymaganiach ma podane .NET 1 (kiedy to było ;) ) a po drugie w tej formie jak jest podany po skompilowaniu dostajemy ładną informacje o wyjątku:

Jest to dość oczywisty wyjątek, gdyż aktualizujemy kontrolkę interfejsu z innego wątku niż została ona utworzona. Jak sobie z tym poradzić? Jest wiele sposób, które także zależa od tego jaka to kontrolka, ale w tym przypadku jest to dość proste i schematyczne.

Po pierwsze, należy sobie dodać do Form1 delegatę. Ja pisałem wcześniej, różnie to bywa i czasami musi ona mieć taka samą sygnaturę jak metoda aktualizująca kontrolkę, ale w przypadku tego progressBar-a nie ma takiej potrzeby:

private delegate void Delegacja();

Następnie fragment kodu, który powoduje wyjątek, czyli:

this.progressBar1.Value = newval;

należy zamienić na intrukcję warunkową, która jeśli będzie to wymagane wywoła metodą Invoke dla naszego paska postępu:

if (this.progressBar1.InvokeRequired)
{
progressBar1.Invoke((Delegacja)delegate
{
this.progressBar1.Value = newval;
});
}

Tym oto prostym sposobem poprawiliśmy ten drobny, aczkolwiek znaczący błąd ;)
Oczywiście intrukcję warunkową if można pominąć, ale usztywni to nasz kod i spowoduje, że będzie mniej odporny na  inne sytuacji, a nie o to chodzi w programowaniu.

Przydałoby się też, aby Microsoft zaktualizował swoje strony i aby dane, szczególnie w materiałach wspracia technicznego, były jak najprecyzyjniesze.

5 odpowiedzi do“Wątki C# i strona Microsoft”

  1. Wielkie dzięki, artykuł się bardzo przydał i dzięki temu, jest już okno loadingu, przed uruchomieniem głównej aplikacji:)
    Pozdrawiam wb

  2. A jak np. wsadzić wartość pola tekstowego do instrukcji warunkowej?

  3. Yyy… a o co chodzi? Bo zes lekko od czapy bez kontektu to pytanie zadal

  4. (Delegacja)delegate – po tym występuje coś w rodzaju definicji delegata? Pierwszy raz widzę taką konstrukcję, dlatego prosiłbym o wytłumaczenie

  5. To są mechnizmy anonimowych metod/delegat i lambd, które zostały wprowadzone w .NET 2.0 oraz 3.0. Więcej można poczytać na MSDN: http://msdn.microsoft.com/en-us/library/0yw3tz5k(v=VS.100).aspx

Zostaw odpowiedź

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>