来自后台线程的 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

  }));