我在vb.net中有一个函数,用一些密码加密文本:
Public Class PROT
Shared Function EncryptWithPassword(Target As String, Password As String) As String
'Target is the given text
'Password is the password
Dim datas as string =""
'store the encrypted text and with password in datas and return it
Return datas
End Function
End Class
我在我的表格中使用这个函数:
Private Sub encryptbtn_Click(sender As Object, e As EventArgs) Handles encryptbtn.Click
Dim texttoencrypt As String = TextBox1.Text
Dim passwordtotext As String = passwordbox.Text
Dim enc As String = PROT.EncryptWithPassword(texttoencrypt, passwordtotext)
IO.File.WriteAllText("C:\Users\Ubaada\Documents\SAFE.txt", enc)
End Sub
当Textbox1中的文本长度小于5000时,代码会将表单挂起仅2秒钟。但是,当我尝试使用100000的长度时,它会挂起表格并且不再响应。它不应该在40秒内响应(因为100000比5000大20倍)。
我的问题是,如何操作代码,以便它不会挂起表单并使用长度为100000或更大的字符串。我听说过线程,但我想我不能这样用它:
Dim enc as string=Thread.Start(PROT.EncryptWithPassword(texttoencrypt, passwordtotext))
答案 0 :(得分:2)
您正在与UI相同的线程中执行代码,因此当任务需要一些时间时它将挂起。你可以通过使用线程来解决这个问题。
在这种情况下,我会使用BackgroundWorker
。设置起来非常简单。您不必过于担心如何设置线程。您只需要实现DoWork
,如果需要,可以实现RunWorkerCompleted
个事件。
您可以为Result
事件的EventArgs
的{{1}}属性分配值。您应该能够在DoWork
,RunWorkerCompleted
媒体资源的EventArgs
事件中访问此值。
如documentation中所述:
如果您的操作产生结果,您可以将结果分配给
DoWorkEventArgs.Result
属性。这将在RunWorkerCompleted
属性中的RunWorkerCompletedEventArgs.Result
事件处理程序中可用。