Wątki C# i strona Microsoft
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.


Ostatnie komentarze