Wywołanie metody w wątku

Wywołanie metody w wątku
0

Zakładając, że w mainie mamy następujący kod:

Kopiuj
PrintNumber p = new Printer();

Thread backroundThread(new ThreadStart(p.PrintNumber));
 backroundThread.Start();

To czy jeśli zamiast:

Kopiuj
Thread backroundThread(new ThreadStart(p.PrintNumber));

użyje takiego zapisu:

Kopiuj
Thread backroundThread(p.PrintNumber);

to będzie to jakiś błąd ?

fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

a czy nie lepiej sprawdzic w dokumentacji?

https://msdn.microsoft.com/pl-pl/library/system.threading.thread(v=vs.110).aspx

Kopiuj
Inicjuje nowe wystąpienie Thread klasy, określając delegata, który umożliwia obiektu mają być przekazane do wątku, gdy wątek jest uruchomiony.```

jezeli printnumber jest funkcja (delegatem) to mozna tak zrobic

https://msdn.microsoft.com/pl-pl/library/1h2f2459(v=vs.110).aspx
edytowany 1x, ostatnio: fasadin
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
0

to będzie to jakiś błąd ?

Tak, to się nie skompiluje. Zresztą jak wszystko w tym kodzie.

fasadin napisał(a):

a czy nie lepiej sprawdzic w dokumentacji?

https://msdn.microsoft.com/pl-pl/library/system.threading.thread(v=vs.110).aspx

Kopiuj
Inicjuje nowe wystąpienie Thread klasy, określając delegata, który umożliwia obiektu mają być przekazane do wątku, gdy wątek jest uruchomiony.```

No, ten tekst udowadnia, że lepiej nie sprawdzać w takiej dokumentacji. :P

edytowany 2x, ostatnio: somekind
Zobacz pozostałe 4 komentarze
somekind
Ale ja mówię o kodzie z pierwszego posta.
fasadin
a to ze jego kod jest zly to zgadzam sie, nigdy nie twierdzilem ze jest dobry :D
somekind
To ja nie wiem co Ci się kompiluje i po co. :P
fasadin
ja nie wiem czemu dokumetancja jest tak zla ;)
somekind
No ja np. kompletnie nic nie rozumiem z tej Twojej dokumentacji. :P
0

A co jeśli chcę dać metodę, która np zwraca inta i ma dwa parametry ? To zarówno ThreadStart ani ParameterizedThreadStart się nie na da, ponieważ oba delegaty przyjmują tylko w konstruktorze metody, które coś zwracają. Na stacku znalazłem, że wtedy piszę się delegata w sposób anonimowy, tak się robi wtedy ?

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
2

A co Ty w ogóle chcesz osiągnąć? Bo na 95% żaden Thread nie jest Ci potrzebny, wystarczy Task.

FP
Może kolega pochodzi ze starej szkoły programowania :) Klasyczne wątki a nie jakieś cudawki-wynalazki ;)
0

Na razie nie uczyłem się o Task tylko o Thread i chcę to zrozumieć.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
1

Ok, rozumiem. To zapakuj sobie swoje dwa parametry w jakąś klasę i użyj ParameterizedThreadStart przekazując obiekt tej klasy.

0

A co jeśli chcę coś zwrócić ? Wedy ```csharp
ParameterizedThreadStart

Kopiuj
PA
  • Rejestracja:ponad 12 lat
  • Ostatnio:17 dni
  • Postów:35
0

Wartość tego co wyliczysz w funkcji przypisujesz do właściwości obiektu i w ten sposób twoja funkcja, która nic nie zwraca będzie mogła jednak "zwrócić" wynik.

edytowany 1x, ostatnio: Papec
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
0

Wątek uruchamia się po to, żeby przeprowadzać jakieś długotrwałe operacje w tle, a nie żeby coś z niego zwracać. Musisz zrobić tak, jak napisał @Papec, tylko pamiętaj o synchronizacji tego pola, które utworzysz, żeby uniknąć jakichś zakleszczeń i innych takich wątkowych problemów.
I zainteresuj się też metodą Thread.Join, ona też Ci chyba tu może pomóc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.