Vb.NET Windowsフォームアプリケーションで作業していて、画像がメモリからロードされているグリッドがありました。低メモリ、プログラムがクラッシュすることがあります。 ダイレクトメモリストリームを使用してメモリを消費し、URLから画像をロードするというソリューションが提案されました。スレッド内の直接URLからGridViewイメージをロードする方法
私はデータグリッドビューを使用していますので、すべての処理をスレッドに入れておく必要があります。画像が安全にロードされ、プログラムが停止することはありません。
以下は、URLから画像を取得してGridView Cellに添付するためのコードです。だれかがスレッドに入れる方法を教えてくれます。あなたの機能を変更せずにそれを行うことができます
Sub SetSource(ByVal dtImages As DataTable)
Try
Dim ImagePath As String = BaseUrl
ImagePath = ImagePath.Replace("/a", "/p") & "vs/"
LockWindowUpdate(Me.Handle)
Try
For Each dRow As DataRow In grdSent.Rows
CType(dRow("img1"), DataGridViewImageCell).Value = Nothing
CType(dRow("img2"), DataGridViewImageCell).Value = Nothing
Next
Catch ex As Exception
End Try
grdSent.Rows.Clear()
Dim i As Integer = 0
While (True)
Dim drIndx As Integer
Dim dr As DataGridViewRow
If (dtImages.Rows.Count > i AndAlso dtImages.Rows(i)("image") IsNot DBNull.Value) Then
drIndx = grdSent.Rows.Add()
dr = grdSent.Rows(drIndx)
Dim ms As New MemoryStream(CType(dtImages.Rows(i)("image"), Byte()))
'CType(dr.Cells("img1"), DataGridViewImageCell).Value = Image.FromStream(ms)
CType(dr.Cells("img1"), DataGridViewImageCell).Value = GetBitmapFromLink(ImagePath & dtImages.Rows(i)("ImageName"))
dr.Cells("img1").Tag = dtImages.Rows(i)("id")
ms.Close()
Else
Exit While
End If
i = i + 1
If (dtImages.Rows.Count >= i) Then
Try
Dim ms As New MemoryStream(CType(dtImages.Rows(i)("image"), Byte()))
'CType(dr.Cells("img2"), DataGridViewImageCell).Value = Image.FromStream(ms)
CType(dr.Cells("img2"), DataGridViewImageCell).Value = GetBitmapFromLink(ImagePath & dtImages.Rows(i)("ImageName"))
dr.Cells("img2").Tag = dtImages.Rows(i)("id")
ms.Close()
Catch ex As Exception
CType(dr.Cells("img2"), DataGridViewImageCell).Value = My.Resources.WhiteDot
dr.Cells("img2").Tag = -1
End Try
Else
Exit While
End If
i = i + 1
End While
If (grdSent.RowCount > 0) Then
'If (grdSentiments.Rows(grdSent.RowCount - 1).Cells("img1").Value Is My.Resources.WhiteDot AndAlso grdSentiments.Rows(grdSent.RowCount - 1).Cells("img2").Value Is My.Resources.WhiteDot) Then
' grdSentiments.Rows.RemoveAt(grdSent.RowCount - 1)
'End If
End If
Catch ex As Exception
WriteToLog(ex)
Finally
LockWindowUpdate(0)
End Try
End Sub
、.NET 3.5のためのあなたの場合には、それはに十分です別のスレッドで 'SetSource'を呼び出します。 'Backgroundworker'の' DoWork'イベントでやることができますし、 'Thread'を使ってこれを行うこともできます。 Anywan、あなたの方法では、いくつかの変更を適用する必要があります。 UI要素にアクセスする各場所で、 'Invoke'を使用してクロススレッド操作の例外を防ぐ必要があります。 –