所以这是我的计划流程:
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()中的代码粘贴到函数中,它就可以正常工作。我做错了什么?
答案 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
为了检查它的工作原理,我用两个图片框测试了它,然后加载了一个缓慢下载的图像和一个快速下载的图像。尽管第二次开始,但是快速首先出现了。