6

Winforms イベントのメソッド シグネチャが何百もあるレガシー プロジェクトがあります。UIクロススレッドの問題が発生するため、BeginInvoke/EndInvokeを実行したくない現在のものは明らかです。

ただし、実行できる必要があるいくつかの非同期コマンドを処理するために、これらの署名を非同期としてマークできるようにする必要があります (デッドロックのため)。デッドロック以外の結果をもたらす方法は他にありません。

私はBeginInvokeでイベントを正常に呼び出すことができ、それは完全に機能し、適切に非同期になります。

そのため、event.GetInvokationList() を使用して調査し、ループしてそれぞれを個別に呼び出していました。メソッドが非同期の場合は、呼び出しを開始/終了します。それ以外の場合は、UI スレッドで直接呼び出します。

私の唯一の問題は、リフレクションを通じてメソッドのシグネチャが非同期かどうかを判断する方法が見つからないことです。

メソッドが MethodInfo または GetInvokationList() 値から非同期かどうかを判断する方法を知っている人はいますか?

ありがとう!

4

3 に答える 3

-1

あなたはそれを検出することも、すべきではありません。asyncでマークされたメソッドは、実際には他の同期メソッドと何ら変わりはありません。定期的に呼び出す必要があります。

また、Begin / EndInvokeは、他のスレッドへの呼び出しをマーシャリングする問題を解決することになっています。その特定の知識が必要な場合、つまりメソッドがこのスレッドで実行されることになっているのかどうかわからない場合は、基本的に混合されていないため、asyncキーワードではなく、そのようなメソッドに独自の特別な属性を使用する必要があります。

于 2012-11-01T23:02:21.853 に答える