簡體   English   中英

外部參考(DLL)中的后台工作程序鎖定了主線程

[英]Background Worker in external reference (DLL) locking main thread

我幾乎每天都使用后台工作者,而且效果很好。 今天,我來到了一個實例,盡管我需要將后台工作人員放在一個我正在運行的項目中,因為我需要在解決方案的兩個不同項目中使用此類。 當我在winforms表單上測試編碼時,它可以完美地工作,並在后台線程上處理我的編碼。 當我嘗試從外部項目中引用此類時,我所有的編碼似乎都運行良好,但是它似乎並未在后台線程上做任何應做的事情,從而導致主窗口鎖定。

有什么辦法解決/在外部類中進行ASYNC調用的最佳實踐是什么?

注意,我基本上創建了一個您稱為start的類,並在數據准備就緒時觸發一個事件,因此,這與外部項目正在等待該方法完成不一樣。

提前致謝


我的senerio的例子

解決方案ABC有兩個項目。 項目A和項目B。項目A是我的WPF應用程序,項目B是我的DLL。 內部項目AI有

Dim SmartCardData as new Solution.B()
SmartCardData.Start()

Project B has a sub

Public Sub Start()

   worker.workerConnect.RunWorkerAsync()

End Sub

Private Sub workerConnect_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles workerConnect.DoWork

'loop 10 seconds connecting to my device
e.Result = true

End Sub

Private Sub workerConnect_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles workerConnect.RunWorkerCompleted

  RaiseEvent Scanner_Connected()

End Sub

(對不起,我無法將其顯示為代碼而非純文本)

首先使用調試器。 在DoWork事件處理程序上設置一個斷點。 當它中斷時,請使用Debug + Windows + Threads並驗證它是否在工作線程上運行,並且您看到列出的Main Thread。 雙擊主線程並查看調用堆棧,確保它處於空閑狀態並且未執行諸如等待BGW完成的操作。 這是有保證的僵局。

下一故障模式是難以診斷的模式。 當您過於頻繁地調用ReportProgress時,即使使用后台工作器,也可以凍結UI線程。 UI線程充斥着調用請求,並且不再能夠正常工作。 喜歡繪畫和回應輸入。 一切仍然按預期進行,工作程序和UI線程實際上正在運行,您只是看不到它。

這很容易發生,報告進度每秒超過一千次是危險區域。 這取決於UI線程在ProgressChanged事件處理程序中需要完成多少工作。 診斷這是否是您的問題的最佳方法是在ReportProgress()調用之后添加System.Threading.Thread.Sleep(45)。 這通常會降低工作人員的速度,以使UI線程有機會趕上。

您可以通過以對人眼有用的速率報告進度來解決問題。 每秒更新25次,除了模糊以外,什么都看不到。 收集bgw會生成一個類似List <>的集合對象,因此您可以通過一個調用(例如AddRange())來更新UI。 如果BGW生成的結果遠遠超出UI消耗的速度,這可能仍然不夠好,您必須跳過結果或人為地減慢工作進程的速度。

后台工作人員在主線程中處理完成的代碼,使UI停止響應。 如果在后台工作程序完成時不希望UI更新,請不要使用后台工作程序。

如果您的外部應用程序是基於控制台的,請改用ThreadPool來運行異步工作。 BackgroundWorker委托需要一個消息泵才能在主線程上執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM