Toast 通知从后台线程失败
Posted
技术标签:
【中文标题】Toast 通知从后台线程失败【英文标题】:Toast notification fails from a background thread 【发布时间】:2015-10-04 08:42:21 【问题描述】:我对此感到有些不知所措。
我有一个单独的计时器线程,每秒滴答一次。如果值达到
...
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 线程吗? 我在与主视图模型相同的线程中的其他地方访问 toastpopup...但是从视图模型中我启动了一个单独的线程,每秒滴答作响。这会修改一个值,如果该值达到 0,则触发上述 sn-p 代码运行。 我不熟悉吐司,但它听起来像是 UI 的东西。你确定你可以在不调用主线程的情况下从后台线程使用它吗? 检查this ans. 既然我们在谈论 Toast 通知,我假设您使用的不是 WPF,而是 WinRT?我建议您修改标签以反映这一点,搜索此答案的人可能会被当前的 WPF 标签误导。 【参考方案1】:我怀疑 Toast 只能从 UI 线程创建,因此构造函数会引发异常。 WPF 中的所有 UI 操作通常只能在 UI 线程中完成。
尝试invoke the Toast constructor on the UI thread。这假设您的应用程序是 WPF 应用程序(从您的问题中不是 100% 清楚)。
您还应该学习如何handle exceptions in non-UI threads in WPF,这样您才能真正了解为什么您的代码会被破坏。
【讨论】:
谢谢 - 调用链接有效。我的谷歌搜索出现了 Invoke 是我应该做的事情,但我不知道如何正确地做到这一点。您提供的链接完美地解释了它,并且有效。谢谢! :)【参考方案2】:您可以使用调度程序。
await Dispatcher.InvokeAsync<Task>(
new Action(() =>
// Put your logic here
));
【讨论】:
以上是关于Toast 通知从后台线程失败的主要内容,如果未能解决你的问题,请参考以下文章
如何确保在使用 MagicalRecord 3.0 保存后台线程后通知 NSFetchedResultsController