我把它留给你,因为我找不到解决问题的方法:/
让我解释一下,当我按下一个按钮时,我会显示一个包含其他按钮的面板,单击面板上的按钮之一,它应该会启动一种将所选文件转换为pdf的方法。用户单击其中一个按钮并确认选择文件后,我使面板不可见,然后启动转换方法。
问题在于我的面板消失了,可以说是一半(不是全部),因为它以最快的速度启动了转换方法。我告诉自己,我要通过第二个线程,但是我无法修改第二个线程上的图形元素。
有我的代码:
Private Sub PBFolder_Click(sender As Object, e As EventArgs) Handles PBFolder.Click
Try
Insert2Db("Debut de la fonction BTransforme_Click " + Environment.UserName.ToString, 1, 0, "ConvertFiles2PDF")
'Log("Debut de la fonction BTransforme_Click")
Dim OFD As New FolderBrowserDialog
If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then
PanFileFolder.Visible = False
ConvertFileFolder(False, OFD.SelectedPath.ToString)
End If
Catch ex As Exception
'Log("Error " + ex.Message)
Insert2Db("Error " + ex.Message + "User : " + Environment.UserName.ToString, 0, 3, "ConvertFiles2PDF")
Finally
Insert2Db("function BTransforme_Click Terminé " + Environment.UserName.ToString, 1, 0, "ConvertFiles2PDF")
'Log("function BTransforme_Click Terminé")
End Try
LAppOne.Visible = True
GifLoad.Visible = False
Button1.Enabled = True
BLog.Enabled = True
End Sub
如您所见,由于以下行,我隐藏了面板: PanFileFolder.Visible = False ,然后启动转换方法 convertFileFolder(False,OFD.SelectedPath.ToString)
我放置了2张图像来说明我的问题。 第一张图片显示单击时出现的面板:
完成文件转换后,此时面板将正确消失。 您有解决此问题的想法吗?谢谢!)
答案 0 :(得分:0)
我告诉自己,我要经历一个辅助线程, 但是我无法在第二个线程上修改图形元素。
这正是解决您的问题的方法; ConvertFileFolder()
需要在其他线程中运行,以便GUI可以刷新自身并响应用户交互。您可以使用Invoke()
调用从该辅助线程更新GUI。
在这里,我已将Async
添加到Button单击处理程序中,然后我们Await
ConvertFileFolder()
函数,该函数现在返回Task
:
Private Async Sub PBFolder_Click(sender As Object, e As EventArgs) Handles PBFolder.Click
' ... other code ...
Using OFD As New FolderBrowserDialog
If OFD.ShowDialog = DialogResult.OK Then
PanFileFolder.Visible = False
Await ConvertFileFolder(False, OFD.SelectedPath.ToString)
End If
End Using
' ... other code ...
End Sub
Public Function ConvertFileFolder(ByVal someFlag As Boolean, ByVal someString As String) As Task
Return Task.Run(Sub()
' ... long running code in here ...
For i As Integer = 1 To 10
System.Threading.Thread.Sleep(1000) ' some "work"
' whenever you need to update the GUI, use Invoke()
Dim value As String = i.ToString
Me.Invoke(Sub()
Label1.Text = value
End Sub)
Next
End Sub)
End Function