Brandon
Brandon

Reputation: 945

thread was created with a ThreadStart delegate that does not accept a parameter

I have a question about ThreadStart delegates in vb.net. I am taking over a senior programmer's project, and he is much more experienced then myself so I'm kind of lost on what he was trying to do. I am trying to do some research on Threading but there is a lot out there on this topic and don't want to waste my time with stuff that doesn't pertain to my error here. I will post the whole exception message and hopefully someone can point me in the direction of an article that I could read to learn more about it.

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: 

Here is the function that the error is getting thrown in, but I don't know how much help it will be by itself.

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

And here is the AddJob method

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

Upvotes: 2

Views: 6662

Answers (3)

Adam Robinson
Adam Robinson

Reputation: 185663

Your AddJob sub does not accept a parameter. If you want it to accept a parameter, you'll need to change its signature to accept a single parameter of type Object. You will, of course, need to modify the body of the message to make use of that parameter for it to have any actual effect, though.

Upvotes: 0

Tudor
Tudor

Reputation: 62459

Without the code I can only speculate that you're creating the thread using ThreadStart and then calling the overload of Start that takes a parameter.

You should either use ParameterizedThreadStart or simply call the Start method with no parameters.

Edit: Like I said, the thread start method call is not compatible with the definition of AddJob. Simply use Thread.Start().

Upvotes: 1

Rolf Bjarne Kvinge
Rolf Bjarne Kvinge

Reputation: 19345

The AddJob method doesn't have the right signature, it needs to have exactly 1 object parameter.

Upvotes: 0

Related Questions