c# - 后台线程的 Toast 通知失败

标签 c# wpf multithreading toast

我对此感到有点不知所措。

我有一个单独的计时器线程,每秒滴答一次。如果某个值<= 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 行将运行,并且日志行将显示在文件中。但是,如果我取消注释中间行,它就会开始运行该行,但似乎很快就会停止,然后永远不会运行日志文件行。这是 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 弹出窗口不会显示,但在代码中的其他位置使用相同的代码时运行良好。

最佳答案

我怀疑 Toast 只能从 UI 线程创建,因此构造函数会抛出异常。通常,WPF 中的所有 UI 操作只能从 UI 线程完成。

尝试invoke the Toast constructor on the UI thread 。这假设您的应用程序是 WPF 应用程序(您的问题并不能 100% 清楚)。

您还应该学习如何handle exceptions in non-UI threads in WPF ,这样你就可以真正明白为什么你的代码会被破坏。

关于c# - 后台线程的 Toast 通知失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428183/

相关文章:

c# - 获取 Json Controller 方法的参数

c# - 尝试 COM,C# 默认使用 stdcall 还是必须指定

c# - 你能告诉 AutoMapper 在映射时全局忽略缺失的属性吗?

c# - 针对列表的多个搜索关键字

wpf - 检测应用程序退出以及在未保存更改时如何停止

java - 静态和非静态方法的同步

c# - MVC : How can I change a Html. 网格行的颜色基于值?

c# - 添加拖放行为

c# - Un-Threaded 比线程更快

python - 每次迭代在多个 CPU 上训练不同的 scikit-learn 分类器