use*_*240 5 .net vb.net encryption backgroundworker
我是一个自学的新手,正在试验Rijndael 加密算法,我以前让它工作得很好,但是由于试图让加密在后台工作人员上运行以释放用户的表单,我遇到了很多问题。
首先,我尝试将我在以前的代码中使用的 byval 放入后台工作程序中,但是我遇到了一个错误,因为它不兼容——特别是 ByVal Direction As CryptoAction.
所以要清楚,我正在尝试这样的事情:
Private Sub bw_DoWork(ByVal sender As Object,ByVal strInputFile As String,
ByVal strOutputFile As String,
ByVal bytKey() As Byte,
ByVal bytIV() As Byte,
ByVal Direction As CryptoAction, ByVal e As DoWorkEventArgs)
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
For i = 1 To 1
If bw.CancellationPending = True Then
e.Cancel = True
Exit For
Else
'Encryption code goes here.
end sub
Run Code Online (Sandbox Code Playgroud)
但正如我所说,有人告诉我,Direction As CrytoAction 不兼容。出于完整性考虑,该子项是:
Private Enum CryptoAction
'Define the enumeration for CryptoAction.
ActionEncrypt = 1
ActionDecrypt = 2
End Enum
Run Code Online (Sandbox Code Playgroud)
因此,为了让代码正常工作,我完成了此操作,我认为这就是为什么我的加密文件会解密为无法读取的文件,并且有时会收到错误消息:Padding is invalid and cannot be removed。关闭文件流时。
所以我在我的公共类中声明了字节键、byIV、方向和其余部分,正如我所说的让代码运行。但是我可以在加密后取回文件。我的想法是,当我的代码引用函数时,它不是接收返回值,而是接收空字符串?
这是引用生成密钥的函数的代码,只是为了清楚我的意思。
Select Case Direction
Case CryptoAction.ActionEncrypt
csCryptoStream = New CryptoStream(fsOutput, _
cspRijndael.CreateEncryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
Case CryptoAction.ActionDecrypt
csCryptoStream = New CryptoStream(fsOutput, _
cspRijndael.CreateDecryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
End Select
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,代码引用声明中的空值是对的,还是代码仍然引用函数?并且,是否可以将 ByVal CryptoStream 添加到后台工作程序中?
我对我的问题的规模表示最诚挚的歉意,我到处寻找解决方案,但找不到任何相关的内容。
您无法更改事件的签名DoWork,但它包含一个Object供您使用的通用名称(称为e.Argument)。定义一个自定义类来包含要移入和移出的所有数据BackgroundWorker。
Option Strict On
Public Class Form1
Class MyParameters
Friend Input As Integer
Friend Output As Integer
Friend Message As String
End Class
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim m As New MyParameters
m.Input = 1
ListBox1.Items.Add("Button1_Click")
ListBox1.Items.Add(" Input: " & m.Input)
BackgroundWorker1.WorkerReportsProgress = True
BackgroundWorker1.RunWorkerAsync(m) 'this triggers BackgroundWorker1_DoWork. When finished, BackgroundWorker1_RunWorkerCompleted() is raised
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim m As MyParameters = DirectCast(e.Argument, MyParameters) 'Convert the generic Object back into a MyParameters object
m.Message = "Progress report"
BackgroundWorker1.ReportProgress(50, m) 'this triggers BackgroundWorker1.ProgressChanged. N.B. We could actually use a different class here, but we'll re-use the same class for simplicity
m.Output = m.Input + 1
e.Result = m
'fun continues at BackgroundWorker1_RunWorkerCompleted
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ListBox1.Items.Add("BackgroundWorker1_ProgressChanged")
Dim m As MyParameters = DirectCast(e.UserState, MyParameters) 'Convert the generic Object back into a MyParameters object
ListBox1.Items.Add(" " & m.Message & " " & e.ProgressPercentage.ToString)
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
ListBox1.Items.Add("BackgroundWorker1_RunWorkerCompleted")
Dim m As MyParameters = DirectCast(e.Result, MyParameters) 'Convert the generic Object back into a MyParameters object
ListBox1.Items.Add(" Output: " & m.Output)
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)