私のアプリは、時々バルーン通知を表示する必要があります。私はAction
を実行してNotifyIcon
を作成し、バルーン通知を表示してシステムトレイアイコンを廃棄するDispatcher.Invoke()
でこれを行います。Dispatcher.Invokeが呼び出されないことがあります
public abstract class Foo {
void Bar() {
MainWindow.ShowTrayNotification(ToolTipIcon.Info, "Hello There!", "Balloon text here.");
}
}
public partial class MainWindow : Window {
static Dispatcher dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;
public static void ShowTrayNotification(ToolTipIcon icon, string title, string text) {
dispatcher.Invoke(new Action(() => {
//anything here is not run
UIHelper.ShowTrayNotification(icon, title, text); //static method
}));
//anything here is also not called if dispatcher.Invoke() is not run
}
}
ただし、Dispatcher.Invoke
が実行されないことがあります。ロギングはその直前で停止し、Invoke
のAction
の内部でロギングは発生しません。
私がPCシャットダウンを起動すると、突然Invoke
が起動し(通知が表示され)、正常に処理されます(シャットダウン前のコールバックが実行されます)。
デバッグ> Windows>スレッドを実行しようとしましたが、デバッグモードで問題が発生しないため、UIスレッドがブロックする原因を見つけることができません。
この原因とは何ですか?どのように修正できますか?
UPDATE
私は、次を試してみましたが、彼らは動作しませんでした:
私は
BeginInvoke
にそれを変更しました。DispatcherPriority.Send
を加えた。
UPDATE 2
public class UIHelper
{
public static void ShowTrayNotification(ToolTipIcon icon, string title, string text) {
NotifyIcon trayIcon = new NotifyIcon();
trayIcon.Icon = MyApp.Properties.Resources.myIcon;
trayIcon.Text = "MyApp";
trayIcon.BalloonTipClosed += TrayNotificationClosed;
trayIcon.Visible = true;
trayIcon.ShowBalloonTip(5000, title, text, icon);
}
static void TrayNotificationClosed(object sender, EventArgs e) {
((NotifyIcon)sender).Visible = false;
((NotifyIcon)sender).Icon = null;
((NotifyIcon)sender).Dispose();
sender = null;
}
}
方法を参照してください? 'UIHelper.Dispatcher.Invoke ... 'のようにするか、ディスパッチャの前に' MessageBox'を置いてみてください.Invokeメソッドが実行されているかどうか確認してください。それは単なる提案です。 –
アプリのUIスレッドが別のもので占有されていると、Dispatcher.Invoke()がデッドロックします。 Debug> WIndows> Threadsデバッガーウィンドウを使用して診断します。 –
@JakubLokša 'dispatcher.Invoke'は決して動かない。 'MainWindow'のディスパッチャを使用して、' UIHelper'の 'NotifyIcon'がメインのUIスレッドで作成されていることを確認します。そうでなければ、表示されません。 – Obay