遇到與任務和委託有關的奇怪問題。有問題的代碼在dotNET 4.5.1,VS2013下運行。在表單的代碼中,我有一個更新網格的子節點,它檢查是否需要調用,如果是,則調用委託。當在同一模塊中調用的任務運行時,它按預期工作,沒有問題。螺紋與否,網格更新正確。代表不在另一個模塊中工作
但是,如果從另一個模塊調用相同的東西,委託永遠不會被調用,並且可視組件不會被更新。只是僞代碼的淡化一點,以澄清..
在窗體的模塊:
Private Delegate Sub DoWhateverDelegate(ByVal _____)
Public Sub DoWhatever(ByVal _____)
If MyComponent.InvokeReqired
Dim Delegated As New DoWhateverDelegate(AddressOf DoWhatever)
Debug.Print("The delegate fired")
Invoke(Delegated, _____)
Else
' .. carry on as usual ..
End If
End Sub
在其他地方....
Task.Run(Sub()
' .. various things I'd rather not block the UI thread with ..
DoWhatever()
End Sub)
工作正常。我可以做Task.Run_ _,調用DoWhatever,它都是開心和好。但是,如果我在另一個模塊中創建一個任務並調用DoWhatever,它不會觸發該委託,並且該可視組件不會更新。代碼是相同的,在相同的模塊中工作,在另一個模塊中它不工作。
我可能錯過了明顯的東西..任何人都在意指出我的錯誤?謝謝。
編輯 - 爲了澄清,其他模塊只是代碼,整個解決方案中只有一種形式。它在程序啓動時自動創建,沒有其他表單創建正在進行。
嘗試'MyComponent.Invoke(Delegated,...)'順便說一句:你不是使用像'Form1'等東西,而是'f = new Form1',是嗎?因爲「默認實例」是線程特定的... – igrimpe
試過了,沒有效果。它仍在調用「未委託」代碼,該代碼確實運行但可視組件未更新。我在各種模塊中使用代碼的唯一原因是爲了組織......我總是可以將它移回到一個模塊中,它可以工作......我只是很好奇它爲什麼沒有按預期工作。就表單本身而言,它是在啓動時創建的,即「主表單」,而不是手動創建的。 –
我認爲委託人和委託人的目標方法必須公開才能發揮作用。 – PMF