向后台工作人员传递值和从后台工作人员传递值

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 添加到后台工作程序中?

我对我的问题的规模表示最诚挚的歉意,我到处寻找解决方案,但找不到任何相关的内容。

SSS*_*SSS 3

您无法更改事件的签名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)