タスクとデリゲートで奇妙な問題が発生します。問題のコードは、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)
正常に動作します。DoWhatever を呼び出す Task.Run_ _を実行できます。ただし、別のモジュールでタスクを作成して DoWhatever を呼び出すと、デリゲートが起動されず、そのビジュアル コンポーネントが更新されません。コードは同じで、同じモジュールでは機能しますが、別のモジュールでは機能しません。
私はおそらく露骨に明らかな何かを見逃しています..誰かが私の間違いを指摘してくれますか? ありがとう。
編集 - 明確にするために、他のモジュールは単なるコードであり、ソリューション全体でフォームは 1 つだけです。プログラムの起動時に自動的に作成され、他のフォーム作成は行われません。