visual basic thread handling(等待其他线程)

时间:2017-04-25 12:37:37

标签: vb.net multithreading printing

我有以下sub,它在创建新文件时在新线程中启动另一个sub。第二个子打印文件(PDF)。到目前为止一切正常。

Private Sub PrintPDF(Datei As String)
    Try
        Dim startPrint As New Thread(AddressOf PrintNow)
        startPrint.IsBackground = False
        startPrint.Start(Datei)
    Catch ex As Exception
        sendmail(__FUNCTION__(), ex.Message, True)
        Err.Clear()
    End Try
End Sub

现在我的问题。在某些情况下,我必须打印文件两次或更多次(不同的纸盘)。当同一台打印机的两个文件同时创建时,会发生以下输出:

打印1 - 第1页 打印2 - 第1页 打印1 - 第2页 打印2 - 第2页

我从文件名中使用了哪台打印机:
00_99999999〜FreePDF〜1〜0〜1〜1_K1_K2_AA_AA〜0〜16〜201703020716530219.pdf
- > FreePDF

现在我的问题是:如果另一个线程使用相同的打印机,是否有可能等待线程结束?如果打印机没有正在运行的线程,则可以进行并行打印。

提前谢谢。

迈克尔

1 个答案:

答案 0 :(得分:1)

您可以同步用于打印的代码的关键部分。使用打印机名称字典来对象来组织锁定对象。

Private dictionaryLock As New Object()
Private printerLocks As New Dictionary(Of String, Object)()

Private Sub PrintNow(datei As String)
    Dim printerName = datei.Split("~"c)(1)
    SyncLock dictionaryLock
        If Not printerLocks.ContainsKey(printerName) Then
            printerLocks.Add(printerName, New Object())
        End If
    End SyncLock
    SyncLock printerLocks(printerName)
        Console.WriteLine("Started printing on {0} - {1}", printerName, datei)
        Thread.Sleep(2000) ' print here
        Console.WriteLine("Finished printing on {0} - {1}", printerName, datei)
    End SyncLock
End Sub

使用此

进行测试
Sub Main()
    PrintPDF("0~FreePDF1~1")
    PrintPDF("0~FreePDF2~1")
    PrintPDF("0~FreePDF7~1")
    PrintPDF("0~FreePDF1~2")
    PrintPDF("0~FreePDF4~1")
    PrintPDF("0~FreePDF2~2")
    PrintPDF("0~FreePDF1~3")
    PrintPDF("0~FreePDF3~1")
    PrintPDF("0~FreePDF3~2")
    PrintPDF("0~FreePDF5~1")
    PrintPDF("0~FreePDF1~4")
    PrintPDF("0~FreePDF2~3")
    PrintPDF("0~FreePDF6~1")
    PrintPDF("0~FreePDF3~3")
End Sub
  

开始在FreePDF1上打印 - 0~FreePDF1~1   
开始在FreePDF4上打印 - 0~FreePDF4~1   
开始在FreePDF2上打印 - 0~FreePDF2~1   
开始在FreePDF7上打印 - 0~FreePDF7~1   
开始在FreePDF5上打印 - 0~FreePDF5~1   
开始在FreePDF3上打印 - 0~FreePDF3~1   
开始在FreePDF6上打印 - 0~FreePDF6~1   
在FreePDF4上完成打印 - 0~FreePDF4~1   
在FreePDF1上完成打印 - 0~FreePDF1~1   
开始在FreePDF1上打印 - 0~FreePDF1~2   
在FreePDF2上完成打印 - 0~FreePDF2~1   
开始在FreePDF2上打印 - 0~FreePDF2~2   
在FreePDF7上完成打印 - 0~FreePDF7~1   
在FreePDF5上完成打印 - 0~FreePDF5~1   
在FreePDF3上完成打印 - 0~FreePDF3~1   
开始在FreePDF3上打印 - 0~FreePDF3~2   
在FreePDF6上完成打印 - 0~FreePDF6~1   
在FreePDF1上完成打印 - 0~FreePDF1~2   
开始在FreePDF1上打印 - 0~FreePDF1~3   
在FreePDF2上完成打印 - 0~FreePDF2~2   
开始在FreePDF2上打印 - 0~FreePDF2~3   
在FreePDF3上完成打印 - 0~FreePDF3~2   
开始在FreePDF3上打印 - 0~FreePDF3~3   
在FreePDF1上完成打印 - 0~FreePDF1~3   
开始在FreePDF1上打印 - 0~FreePDF1~4   
在FreePDF2上完成打印 - 0~FreePDF2~3   
在FreePDF3上完成打印 - 0~FreePDF3~3   
在FreePDF1上完成打印 - 0~FreePDF1~4