Jag försöker göra ett program med CF3.5 där en tråd (tråd2) laddar ner innehållet från en sida och den nerladdade datan ska användas av tråd1 (originaltråden). Vad får du för fel? Hurdan data hämtar du? En möjlighet är ju att du trycker in datan i nån blockerande kö, som tråd 1 väntar på. Det är ren text jag hämtar. Felet jag får är NotSupportedException. Det händer alltid så fort jag försöker mixa trådarna på nått sätt. Dvs en variabel deklarerad i tråd1 som jag försöker sätta med tråd2, komma åt en kontroll i forumuläret (som ju är skapad med tråd1 givetvis) från tråd2 osv. Hittade en bloggpost om multitrådade applikationer med CF3.5, du kan ju kolla den för lite idéer: http://remark.wordpress.com/articles/multithreading-with-the-net-compact-framework-35/. Att försöka accessa UI:t från annan tråd utan Invoke är helt förbjudet i .NET. Aha. Jag har löst problemet med Invoke men det där verkar nog smidigare.CF3.5: Flera trådar
Nerladdningen går utmärkt, men jag får fel så fort jag ska försöka röra datan från tråd1 alteernativt lägga datan i en variabel skapad i tråd1 från tråd2.
Programmet består av den här koden:
<code>
Dim myThread As New Threading.Thread(New Threading.ThreadStart(AddressOf GetHTML))
myThread.Start()
</code>
GetHTML sköter nerladdningen, men var ska datan lagras? Och hur ska tråd1 få tillgång till den?
ThomasSv: CF3.5: Flera trådar
Sv:CF3.5: Flera trådar
ThomasSv: CF3.5: Flera trådar
Kan som sagt int .Net, så det kan vara heeelt fel också.Sv: CF3.5: Flera trådar
Vilka klasser använder du för att hämta datan? Det brukar vara betydligt enklare att använda asynkrona metoder istället för egenskapade trådar.
Exempelvis har HttpWebRequest asynkrona metoder. Istället för HttpWebRequest.GetResponse() använder du HttpWebRequest.BeginGetResponse() och så får du ett event när det är klart. Returvärdet får du istället ifrån EndGetResponse().
Imports System.Net
Imports System.IO
Public Class Form1
Private request As HttpWebRequest
Public Delegate Sub UpdateTextCallback(ByVal text As String)
Public Sub New()
InitializeComponent()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
request = WebRequest.Create("http://www.pellesoft.se")
Dim result As IAsyncResult = request.BeginGetResponse(New AsyncCallback(AddressOf Callback), Nothing)
End Sub
Private Sub Callback(ByVal result As IAsyncResult)
Dim response As HttpWebResponse = request.EndGetResponse(result)
Dim sr As New StreamReader(response.GetResponseStream())
Dim data As String = sr.ReadToEnd()
sr.Close()
TextBox1.Invoke(New UpdateTextCallback(AddressOf UpdateText), New Object() {data})
End Sub
Private Sub UpdateText(ByVal text As String)
textBox1.Text = text
End Sub
End Class
Sv:CF3.5: Flera trådar
Tackar.
Thomas