线程是使用不接受参数的ThreadStart委托创建的

时间:2012-10-08 12:38:43

标签: wpf vb.net multithreading xaml

我对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

3 个答案:

答案 0 :(得分:1)

如果没有代码,我只能推测您使用ThreadStart创建线程,然后调用带有参数的Start重载。

您应该使用ParameterizedThreadStart或只使用没有参数的Start方法。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的AddJob子不接受参数。如果您希望它接受参数,则需要更改其签名以接受Object类型的单个参数。当然,您需要修改消息正文以使使用该参数,以使其具有任何实际效果。