Outlook 2010アドイン(VSTOを使用)は、メールが送信されるときに別のスレッドでいくつかのWebサービス呼び出しを実行します。Webサービス呼び出しの結果を表示する小さな非モーダルポップアップ通知(Skype / yahoo / Windowsライブメッセンジャーの通知など)を表示したいと思います。
要件に応じて通知ウィンドウプロジェクトをカスタマイズしようとしていました。次のコードを使用して、アドインのフォームのクリックイベントハンドラーから呼び出された場合は、正常に機能しているようです。
private void btnOk_Click(object sender, EventArgs e)
{
PopupNotifier notifier = new PopupNotifier();
notifier.DisplayNotification("Test");
}
ただし、同じメソッドnotifier.DisplayNotification( "Test")がWebサービス呼び出しを実行しているバックグラウンドスレッドから呼び出されると、通知機能がハングします。そのフォームは画面に表示されますが、テキスト、色、またはアニメーションが機能していないようです。Outlookが閉じられるまでそこにあります。
いくつか検索を行ったところ、通知機能がフォームの表示にShowDialog()ではなくShow()メソッドを使用しているため、これが発生する可能性があることがわかりました。また、ポップアップ通知のモーダルダイアログが必要ないため、メソッドをShowDialog()に変更することもできません。
他の記事によると、backgroundWorkers、delegate、MethodInvokerなどを使用してメソッドを呼び出そうとしましたが、目的の結果を得ることができませんでした。
しかし、上記を試してみると、ポップアップ通知機能だけでなく、単純なフォームでも同じことが起こることに気付きました。バックグラウンドスレッドで作成してShow()メソッドを呼び出すと、スタックしますが、同じ状況ではShowDialog()は正常に機能しているようです。
これをどのように修正できるかについてのアイデアをいただければ幸いです。