线程时Webclient不工作(VB 2013)

时间:2014-06-08 14:01:33

标签: vb.net multithreading

所以这是我的计划流程:

Public Function previewAssigner()
    Dim pt1 As Thread

    pt1 = New Thread(AddressOf pt)

    pt1.Start()
End Function
Private Sub pt()
    MsgBox("PT")

    Dim tClient As WebClient = New WebClient

    Dim tImage As Bitmap = Bitmap.FromStream(New MemoryStream(tClient.DownloadData(apicurl)))

    FormDisplay.PictureBox1.Image = tImage
End Sub

Messagebox出现说PT就好了,但图片没有加载。但是如果我将pt()中的代码粘贴到函数中,它就可以正常工作。我做错了什么?

1 个答案:

答案 0 :(得分:0)

从不同的线程访问控件有点繁琐:请参阅How to: Make Thread-Safe Calls to Windows Forms Controls

如果您想要一个方法将任意PictureBox设置为来自任意URL的图像,您可以这样做:

Imports System.IO
Imports System.Net
Imports System.Threading

Public Class Form1

    Delegate Sub SetImageCallback(target As PictureBox, bmp As Bitmap)

    Friend Class ImageLoaderParameters
        Property Target As PictureBox
        Property URL As Uri
    End Class

    Sub LoadImageFromUrl(target As PictureBox, url As Uri)
        Dim ilp As New ImageLoaderParameters With {.Target = target, .URL = url}
        Dim t1 As New Thread(AddressOf LoadImageFromUrlHelper)
        t1.Start(ilp)

    End Sub

    Private Sub LoadImageFromUrlHelper(args As Object)
        Dim ilp = DirectCast(args, ImageLoaderParameters)
        Using wc As New WebClient
            Dim tImage As Bitmap = CType(Bitmap.FromStream(New MemoryStream(wc.DownloadData(ilp.URL))), Bitmap)
            SetImage(ilp.Target, tImage)
        End Using

    End Sub

    Friend Sub SetImage(target As PictureBox, bmp As Bitmap)
        If target.InvokeRequired Then
            Dim d As New SetImageCallback(AddressOf SetImage)
            Me.Invoke(d, New Object() {target, bmp})
        Else
            target.Image = bmp
        End If

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim src1 As New Uri("file:///C:/temp/hit.png")
        LoadImageFromUrl(PictureBox1, src1)

    End Sub

End Class

为了检查它的工作原理,我用两个图片框测试了它,然后加载了一个缓慢下载的图像和一个快速下载的图像。尽管第二次开始,但是快速首先出现了。