2

我对 vb.net 中的 ThreadStart 委托有疑问。我正在接手一个高级程序员的项目,他比我更有经验,所以我对他想做的事情有点迷茫。我正在尝试对线程进行一些研究,但是关于这个主题有很多,并且不想浪费我的时间在与我的错误无关的东西上。我将发布整个异常消息,希望有人可以指出我可以阅读的文章的方向以了解更多信息。

System.InvalidOperationException was unhandled
  Message=The thread was created with a ThreadStart delegate that does not accept a parameter.
  Source=mscorlib
  StackTrace:
       at System.Threading.Thread.Start(Object parameter)
       at LabelLibrary.LabelPrinter.Print(PrintQueue queue) in C:\Documents and Settings\bjorandb\Desktop\LabelPrintingService\LabelTemplates\clsLabelPrinter.vb:line 94
       at LabelLibrary.LabelPrinter.Print() in C:\Documents and Settings\bjorandb\Desktop\LabelPrintingService\LabelTemplates\clsLabelPrinter.vb:line 53
       at PrintApplyApplication.HomeController.PrintThread.Print() in C:\Documents and Settings\bjorandb\Desktop\LabelPrintingService\PrintApplyApplication\Controllers\HomeController.vb:line 85
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.runTryCode(Object userData)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

这是引发错误的函数,但我不知道它本身会有多大帮助。

Public Function Print(ByVal queue As PrintQueue) As PrintResult
    Dim result As PrintResult = Nothing
    Dim job As PrintSystemJobInfo = Nothing
    Dim thread As Threading.Thread = Nothing

    result = New PrintResult
    If queue Is Nothing Then
        result.Status = "Can not find printer " & queue.Name & "."
    ElseIf PrintFilePath Is Nothing Then
        result.Status = "Print File Path Cannot be nothing."
    Else
        Try
            thread = New Threading.Thread(AddressOf AddJob)
            thread.SetApartmentState(Threading.ApartmentState.STA)
            thread.Start(queue) <--- (Exception is being thrown here!!)
            result.Status &= "Print Sent Successfully"
        Catch ex As PrintJobException
            If ex.InnerException.Message = "File contains corrupted data." Then
                result.Status &= "Could not generate a label with given xps file. Check the xps file format and if it is corrupted."
            End If
            result.Status &= "There was an error printing."
            result.ErrorMessage = ex.Message
        End Try
        If queue.IsOutOfPaper Then
            result.Status &= "The printer is out of Paper."
        End If
        If queue.IsPaperJammed Then
            result.Status &= "The Printer is jammed."
        End If
        If (queue.IsOutOfMemory) Then
            result.Status &= "The Printer is out of memory."
        End If
    End If
    Return result
End Function

这是 AddJob 方法

Private Sub AddJob()
    Dim job As PrintSystemJobInfo = Nothing

    Try
        job = LocalPrintServer.GetDefaultPrintQueue.AddJob("Text", PrintFilePath, False)
        job.Refresh()
        While Not (job.IsCompleted Or job.IsDeleted)
            job.Refresh()
        End While
    Catch ex As PrintJobException
    End Try
    If System.IO.File.Exists(PrintFilePath) Then
        System.IO.File.Delete(PrintFilePath)
    End If
End Sub
4

3 回答 3

1

如果没有代码,我只能推测您正在使用创建线程ThreadStart,然后调用它的重载Start需要一个参数。

您应该使用ParameterizedThreadStart或直接调用Start不带参数的方法。

编辑:就像我说的,线程启动方法调用与AddJob. 只需使用Thread.Start().

于 2012-10-08T13:02:50.707 回答
0

AddJob 方法没有正确的签名,它需要正好有 1 个对象参数。

于 2012-10-08T13:16:19.943 回答
0

您的AddJobsub 不接受参数。如果你想让它接受一个参数,你需要改变它的签名来接受一个 type 的参数Object。当然,您将需要修改消息的正文以使用该参数以使其具有任何实际效果。

于 2012-10-08T13:20:22.033 回答