问题标签 [dispatcher]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
21804 浏览

wpf - WPF 中的 Dispatcher 对象有什么用?

WPF 中的 Dispatcher 对象有什么用?

0 投票
7 回答
25922 浏览

c# - WPF Dispatcher.Invoke 'hanging'

我有一个有点复杂的 WPF 应用程序,当尝试使用调度程序调用 UI 线程上的调用时,它似乎“挂起”或陷入等待调用。

一般流程是:

  1. 处理按钮上的点击事件
  2. 创建一个新线程(STA):创建演示者和 UI 的新实例,然后调用方法Disconnect
  3. 然后断开连接在 UI 上设置一个名为Name的属性
  4. 然后 Name 的设置器使用以下代码设置属性:

我的问题是,当调用调度程序调用方法时,它似乎每次都挂起,并且调用堆栈表明它处于睡眠状态,等待或加入 Invoke 实现。

那么,是否有什么我做错了,我错过了,明显与否,或者是否有更好的方法来调用 UI 线程来设置这个属性(和其他属性)?

编辑:解决方案是在线程委托结束时调用 System.Windows.Threading.Dispatcher.Run() (例如,正在执行工作的位置) - 感谢所有帮助的人。

0 投票
7 回答
2337 浏览

c - 如果我的编译器对函数指针的支持被破坏,我该如何编写调度程序?

我正在开发一个嵌入式应用程序,其中设备通过命令界面进行控制。我在 VC 中模拟了命令调度程序,并让它运行得令我满意;但是当我将代码移到嵌入式环境时,我发现编译器的指针函数的实现被破坏了。

以下是我最初实现代码的方式(在 VC 中):

如果不使用函数指针,似乎我唯一的希望是使用 switch()/case 语句来调用函数。但我想避免手动维护一个大的 switch() 语句。

我想做的是将所有 COMMAND_ENTRY 行移动到一个单独的包含文件中。然后用不同的#define 和#undefines 包装包含文件。就像是:

有没有人看到更好的方法来处理这种情况?可悲的是,“获得另一个编译器”不是一个可行的选择。:(

---编辑添加:只是为了澄清,特定的嵌入式环境被破坏,因为编译器应该创建一个“函数指针表”,然后编译器使用它来通过指针解析对函数的调用。不幸的是,编译器坏了,没有生成正确的函数表。

所以我没有一个简单的方法来提取函数地址来调用它。

--- 编辑#2:啊,是的,使用 void *(set|get)_dispatcher 是我尝试查看问题是否与 func 指针的类型定义有关。本来,我有

0 投票
7 回答
70743 浏览

winforms - System.Windows.Threading.Dispatcher 和 WinForms?

是否在应用程序System.Windows.Threading.Dispatcher的 UI 线程上工作WinForms

如果是,为什么?它来自似乎是一个WPF组件的 WindowsBase.dll。

如果没有,我如何将工作单元调用回 UI 线程?我找到了Control.BeginInvoke(),但是创建一个控件来引用原始线程似乎很笨拙。

0 投票
2 回答
4131 浏览

wpf - Dispatcher.DisableProcessing 的实际用途?

WPF中Dispatcher.DisableProcessing在现实生活中的常见用途是什么?当我在代码中构建复杂的 UI 时,我可以使用它来暂停渲染和布局吗?

0 投票
1 回答
2589 浏览

wpf - 如何停止多个 WPF 调度程序之一?

我有一个带有一些后台线程的应用程序(实际上是一个进程内 WCF 服务)。每个线程运行自己的 Dispatcher 以使用一些 WPF 类(MediaPlayer 对象来处理一些音频/视频文件;它使用 BeginInvoke 将一些委托排队,最后调用 Dispatcher.Run)。处理完成后,我想关闭它的调度程序以便线程可以完成。调用 BeginInvokeShutdown 会关闭应用程序中的每个调度程序,从而导致关闭应用程序。

有什么我可以做的,所以调度程序完成了消息循环?

0 投票
3 回答
15292 浏览

wpf - WPF Dispatcher 是多线程问题的解决方案吗?

我对在我的代码中使用 lock 有一种非常不好的感觉,但是现在 WindowBase 的 Dispatcher 存在,我想在任何地方使用它。

例如,我使用一个多线程单例 WCF 服务,它在 PRISM 的 EventAggregator 上发布事件,有效负载是不可变的(它只是数据),并且每个带有调度程序的线程都可以优雅地检索事件,而不会在自己的调度程序中出现死锁。(不仅是 UI 线程,还有数据库调用线程、服务调用线程、日志线程或其他调用慢的线程,因为我不想冻结 UI)。

但是我的问题是这个 Dispatcher 是与 WPF 耦合的,所以当我到处使用它时我感到有点内疚,我觉得这个 Dispatcher 不是为我的用例而创建的。

它是否存在另一个不与 WPF 耦合的 Dispatcher 实现?还是可以滥用它?

谢谢,

更新

Paul Stovell 给我的解决方案是创建一个接口 IDispatcher,以及一个用于 Wpf Dispatcher 的适配器,这样会更容易测试!这个解决方案对我有好处,因为我重构了我的测试,我现在可以在我的测试中使用 SynchronousDispatcherAdapter(多亏了它,我不必在我的测试中使用 WPF 的 Dispatcher)。

使用 Dispatcher 而不是 BackgroundWorker 是有意义的,因为我使用的是多发布者/订阅者模式(使用 PRISM),并且感谢 Dispatcher,每个事件处理程序都在订阅事件的线程上调用。这意味着多线程问题可能发生的唯一点是我的事件的有效负载(我让他不可变)。

我的不同线程之间不直接通信,它们只能发布和订阅事件。因此,数据库调用、日志调用、服务调用、UI 调用在不同的线程上运行并且彼此不知道(它们只知道他们订阅和发布的事件)。

当我从我的 UI 对存储库进行一些调用时,后台工作人员将是有意义的。

但我希望找到一个不使用 BackgroundWorker 的设计,因为我更喜欢使用这种订阅者/发布者模式(我认为它使我的代码更具可读性)

0 投票
1 回答
1758 浏览

silverlight - 尝试在 Silverlight 2 中使用 HttpWebRequest 时出错

我试图从异步调用写入表单。我在网上看到的示例表明这应该可以工作,但我一直收到错误消息。

首先,尽管 Disbatcher 从不调用 p 进行的调用。其次,我在调用 req.EndGetResponse(a); 时收到 System.Security.SecurityException;

什么可能导致问题?

0 投票
2 回答
1321 浏览

c# - 在 WPF 中调用 Dispatcher 的问题

我有一些 UI 代码需要从我的后台演示者线程中更新。所以,我做了以下事情:从我的后台线程,我在 UI 中设置我的属性:

那么,我的设置如下:

我收到以下错误:

The calling thread cannot access this object because a different thread owns it.

我的理解是Dispatcher负责调用不同的线程,所以这个错误让我有点困惑。谢谢!

0 投票
2 回答
2316 浏览

c# - WPF:使用计时器在线程中构建队列

参考我目前正在从事的软件项目

我有以下方法,它们基本上使用计时器移动画布:

现在,从另一个库中,这些方法的调用方式如下:

现在当然,我希望这些动画一个接一个地发生,但是发生的情况是,当调用第二个方法(在本例中为)时,dt.Tick事件处理程序被覆盖,因此,只有第二个方法被执行应该。DispatchTimerTurnLeft(90)

我需要创建某种队列,允许我将方法推送和弹出到该队列,以便dtDispatchTimer计时器)一个接一个地执行它们……按照它们在“队列”中的顺序

我有什么办法可以做到这一点?我是在正确的轨道上,还是完全偏离了轨道?