我对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
答案 0 :(得分:1)
如果没有代码,我只能推测您使用ThreadStart
创建线程,然后调用带有参数的Start
重载。
您应该使用ParameterizedThreadStart
或只使用没有参数的Start
方法。
编辑:就像我说的,线程启动方法调用与AddJob
的定义不兼容。只需使用Thread.Start()
。
答案 1 :(得分:0)
AddJob方法没有正确的签名,它需要正好有1个对象参数。
答案 2 :(得分:0)
您的AddJob
子不接受参数。如果您希望它接受参数,则需要更改其签名以接受Object
类型的单个参数。当然,您需要修改消息正文以使使用该参数,以使其具有任何实际效果。