来自后台线程的 Toast 通知失败
Toast notification fails from a background thread
我对此感到有点不知所措。
我有一个单独的定时器线程,每秒滴答一次。如果某个值命中 <= 0,则这段代码为 运行:
...
EnemyHP = EnemyMaxHP;
//Toast t = new Toast("You died!", "Oh no, you died! the " + Enemies[CurrentEnemy].Name + " killed you, and you lost " + lost + " GP!", NotificationType.Warning);
Log.Info("Player Died!!! Enemy responsible: " + Enemies[CurrentEnemy].Name + ". GP Lost: " + lost + ".");
如果我 运行 原样,Log.Info 行是 运行,并且日志行出现在文件中。但是,如果我取消注释中间行,它会开始 运行 那个,但似乎很快就会停止,然后永远不会 运行s 日志文件行。这是它正在调用的 Toast 中的 CTOR:
public Toast(string Title, string Description, NotificationType Type = NotificationType.Information)
{
toast = new ToastPopUp(Title, Description, "", Type);
toast.Background = new SolidColorBrush(Colors.AliceBlue);
toast.BorderBrush = new SolidColorBrush(Colors.Black);
toast.FontColor = new SolidColorBrush(Colors.Black);
//toast.HyperlinkClicked += this.ToastHyperlinkClicked;
//toast.ClosedByUser += this.ToastClosedByUser;
toast.Show();
}
ToastPopUp 指的是 https://toastspopuphelpballoon.codeplex.com/ - 我正在使用它。当通过此代码 运行 时,吐司弹出窗口不会显示,但 运行 在代码中的其他地方使用相同代码时没问题。
我怀疑 Toast 只能从 UI 线程创建,因此构造函数抛出异常。 WPF 中的所有 UI 操作通常只能从 UI 线程完成。
尝试invoke the Toast constructor on the UI thread。这假设您的应用程序是 WPF 应用程序(您的问题不是 100% 清楚)。
您还应该学习如何 handle exceptions in non-UI threads in WPF,这样您才能真正了解为什么您的代码被破坏了。
您可以使用 Dispatcher。
await Dispatcher.InvokeAsync<Task>(
new Action(() => {
// Put your logic here
}));
我对此感到有点不知所措。
我有一个单独的定时器线程,每秒滴答一次。如果某个值命中 <= 0,则这段代码为 运行:
...
EnemyHP = EnemyMaxHP;
//Toast t = new Toast("You died!", "Oh no, you died! the " + Enemies[CurrentEnemy].Name + " killed you, and you lost " + lost + " GP!", NotificationType.Warning);
Log.Info("Player Died!!! Enemy responsible: " + Enemies[CurrentEnemy].Name + ". GP Lost: " + lost + ".");
如果我 运行 原样,Log.Info 行是 运行,并且日志行出现在文件中。但是,如果我取消注释中间行,它会开始 运行 那个,但似乎很快就会停止,然后永远不会 运行s 日志文件行。这是它正在调用的 Toast 中的 CTOR:
public Toast(string Title, string Description, NotificationType Type = NotificationType.Information)
{
toast = new ToastPopUp(Title, Description, "", Type);
toast.Background = new SolidColorBrush(Colors.AliceBlue);
toast.BorderBrush = new SolidColorBrush(Colors.Black);
toast.FontColor = new SolidColorBrush(Colors.Black);
//toast.HyperlinkClicked += this.ToastHyperlinkClicked;
//toast.ClosedByUser += this.ToastClosedByUser;
toast.Show();
}
ToastPopUp 指的是 https://toastspopuphelpballoon.codeplex.com/ - 我正在使用它。当通过此代码 运行 时,吐司弹出窗口不会显示,但 运行 在代码中的其他地方使用相同代码时没问题。
我怀疑 Toast 只能从 UI 线程创建,因此构造函数抛出异常。 WPF 中的所有 UI 操作通常只能从 UI 线程完成。
尝试invoke the Toast constructor on the UI thread。这假设您的应用程序是 WPF 应用程序(您的问题不是 100% 清楚)。
您还应该学习如何 handle exceptions in non-UI threads in WPF,这样您才能真正了解为什么您的代码被破坏了。
您可以使用 Dispatcher。
await Dispatcher.InvokeAsync<Task>(
new Action(() => {
// Put your logic here
}));