Jak načíst návratovou hodnotu funkce spuštěné v druhém vlákně?   zodpovězená otázka

VB.NET, Threading

Nevíte, jak se dostat k návratové hodnotě funkce, která je spouštěná v jiném vláknu? Viz kód:

'Funkce, co se spouští v novém vlákně, vrací pole
Private Function ProcessNumbers() As Array
        Thread.CurrentThread.Name = "Main1"
	...
        Return pole
End Function
'Hlavní vláko, ve kterém chci načíst pole z vedlejšího vlíkna
Private Sub Dialog1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Thread.CurrentThread.Name = "Main"
       	...
        Dim numberProcessor1 As New Thread(AddressOf ProcessNumbers)
        numberProcessor1.Start()
End Sub

Mám VB.NET 2008

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nejlepší by bylo zapouzdřit vlákno do třídy obsahující spouštěcí metodu a událost, která by nastala po dokončení operace.

Alternativní jednoduché řešení které zde ukážu je zavolat metodu asynchronně a ta po dokončení zavolá jinou metodu, která zpracuje výsledek. Asynchronně spuštěná metoda běží ve vlastním vlákně v Thread Poolu.

Module Module1
  'Delegát metody
  Public Delegate Function ProcessNumbersCallback() As Array

  Sub Main()
    'Delegát zastupuje metodu uvedenou za slovem AddressOf
    Dim numbersProcessor As New ProcessNumbersCallback(AddressOf ProcessNumbers)
    'BeginInvoke spustí metodu asynchronně ve vlastním vlákně
    'Metoda za slovem AddressOf bude zavolána po dokončení
    'asynchronní operace.
    numbersProcessor.BeginInvoke(AddressOf WriteResult, numbersProcessor)
    'Čekat na stisk klávesy
    Console.ReadKey()
  End Sub

  'Metoda která bude spuštěna asynchronně,
  'signatura musí odpovídat delegátu
  Function ProcessNumbers() As Array
    Return New Integer() {1, 2, 3}
  End Function

  Sub WriteResult(ByVal result As IAsyncResult)
    Dim numbersProcessor = DirectCast(result.AsyncState, ProcessNumbersCallback)
    'EndInvoke vrací výsledek asynchronní operace
    Dim numbers As Array = DirectCast(numbersProcessor.EndInvoke(result), Array)
    'Zapsat hodnoty do konzole
    Console.WriteLine("Tyto hodnoty byly zpracovány ve vlastním vlákně:")
    For Each number As Integer In numbers
      Console.WriteLine(number)
    Next
  End Sub
End Module

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback