标签: dispatcher

如何检测Dispatcher.DisableProcessing是否处于活动状态?

如果Dispatcher挂起(Dispatcher.DisableProcessing()调用),则尝试显示消息框时会引发异常.

InvalidOperationException:'Dispatcher processing has a suspended'(参见此处).

有谁知道我怎么能检测到Dispatcher暂停的地方(所以我知道什么时候打电话BeginInvoke())?

编辑1:

为了响应Application.DispatcherUnhandledException事件,我试图显示一个MessageBox.但是,如果在DataBinding(即ItemsControl.ItemsSource)期间抛出此未处理的异常,Dispatcher则会暂停.试图显示MessageBox然后失败.总是使用Dispatcher.BeginInvoke()解决问题,但我不想这样做,除非真的有必要.

编辑2:

使用Reflection完成此操作的方式如下:

var dispatcherType = typeof(Dispatcher);
var countField = dispatcherType.GetField("_disableProcessingCount", BindingFlags.Instance | BindingFlags.NonPublic);
var count = (int)countField.GetValue(Dispatcher.CurrentDispatcher);
var suspended = count > 0;
Run Code Online (Sandbox Code Playgroud)

wpf dispatcher

10
推荐指数
1
解决办法
3702
查看次数

被Dispatcher.BeginInvoke()的行为困惑

有人可以解决我遇到的问题吗?

我正在研究一个wpf项目.方案如下:

我需要在主UI线程上弹出一个窗口(模型窗口),然后关闭它.这些工作是从另一个UI线程开始的(阻止用户点击主UI窗口.)然后我关闭这个窗口.主要代码如下所示.它有效.

据我所知,close方法在ShowDialog()返回之前不会被执行(至少在UI线程上是这种情况,我的意思是没有调度程序的代码),有没有人有多线程的经验?

   Window window;
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Thread thread = new Thread(() =>
           {


              //create a window and let user work from this thread

             //code is omitted.



               //create another window on main UI thread

              Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    window = new Window();
                    window.ShowDialog();
                }));



               //do some work here

               Thread.Sleep(1000);

               Application.Current.Dispatcher.BeginInvoke(new Action(() =>
               {
                   //Thread.Sleep(1000);
                   window.Close();
               }));
           });

        thread.Start();
    }
Run Code Online (Sandbox Code Playgroud)

感谢您的时间!

wpf dispatcher begininvoke

10
推荐指数
1
解决办法
2万
查看次数

什么是计算机科学的批量?

我正在读Akka的调度员,我了解到它用于批量处理.什么是计算机科学的批量?

computer-science dispatcher akka

10
推荐指数
2
解决办法
2174
查看次数

Dispatcher.DisableProcessing的实际用途?

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

wpf multithreading dispatcher

9
推荐指数
1
解决办法
3469
查看次数

如何给Dispatcher.BeginInvoke提供回调函数

当函数以Dispatcher.BeginInvoke启动完成时,我需要使用回调函数来执行一些后处理任务.但是我在Dispatcher.BeginInvoke中找不到任何参数来接受回调.可以给Dispatcher.BeginInvoke提供一个回调函数吗?

.net c# wpf callback dispatcher

9
推荐指数
1
解决办法
5815
查看次数

UI线程块

我创建了一个简单的WPF应用程序,并在默认窗口中添加了一个按钮.当我点击按钮时,会调用一个模拟的长工作方法(使用Thread.Sleep(15000)进行模拟).我试图使按钮异步执行,但是尽管有以下在线示例,按钮和整个窗口会立即锁定单击并保持不变,直到Thread.Sleep(...)结束.

任何想法为什么会这样?

这是代码:

private void button1_Click(object sender, RoutedEventArgs e)
{
   DoSomeAsyncWork();
}

private void DoSomeAsyncWork()
{
     System.Windows.Threading.Dispatcher.Run();
     Thread thread = new System.Threading.Thread(
         new System.Threading.ThreadStart(
          delegate()
          {
               Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => Thread.Sleep(15000)));
          }
        ));
     thread.Start();
}
Run Code Online (Sandbox Code Playgroud)

wpf multithreading deadlock dispatcher

9
推荐指数
1
解决办法
9345
查看次数

为什么BackgroundWorker总是很忙?

我在WPF应用程序中的后台工作者中意识到了一些奇怪的东西.

我现在想要完成的是等到BW完成另一个线程.

检查以下代码:

if (bw.IsBusy)
{
    bw.CancelAsync();

    System.Threading.ThreadStart WaitThread = 
        new System.Threading.ThreadStart(delegate() {
            while (bw.IsBusy)
            {
                System.Threading.Thread.Sleep(100);
            }

            bw.RunWorkerAsync();
        });

    System.Windows.Application.Current.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal,
        WaitThread);  // if I remove this line, bw fires RunWorkerAsyncEvent
}
else
{
    bw.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了一个Dispatcher.Invoke,等到bw不忙,但如果我调用它并且从不触发RunWorkerAsyncCompleted事件,则所有时间都很忙.虽然,如果我删除该行,FIRES事件,这真的很奇怪.

我怎么能等到bw结束?

c# wpf dispatcher backgroundworker dispatch

9
推荐指数
2
解决办法
2万
查看次数

如何将请求从servlet转发到struts2的动作?

我想从一个请求转发的Servlet操作这样使用RequestDispacher这样的

RequestDispatcher dispatcher=request.getRequestDispatcher("hello.action");
dispatcher.include(request, response);
Run Code Online (Sandbox Code Playgroud)

它不起作用.我该如何解决这个问题?

java servlets struts2 dispatcher

9
推荐指数
2
解决办法
9574
查看次数

Dispatcher.CurrentDispatcher.BeginInvoke不调用

FileSystemWatcher当在UI线程的不同线程上引发监视文件更改时,我有一个和由此引发的事件.为了避免和交叉线程的声音乐趣,我试图使用

public void RaisePathChanged(object sender, RenamedEventArgs e)
{
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
    {
        // Some code to handle the file state change here.
    }));
}
Run Code Online (Sandbox Code Playgroud)

这个编译很好,并且RaisePathChanged它应该被解雇.但是,委托中的代码Action(() => { /*Here*/ })永远不会被调用/调用,代码只是被跳过.

为什么要跳过代码,我该如何修复它?这是确保代码在WPF中创建代码的最佳方式吗?

谢谢你的时间.

c# wpf dispatcher

9
推荐指数
2
解决办法
1万
查看次数

具有作业亲和力的作业队列

我目前面临一个问题,我可以肯定有一个正式名称,但是我不知道该在网上搜索什么。我希望如果我描述问题和解决方案时想到的,有人能够告诉我设计模式的名称(如果有一个与我要描述的内容相匹配的设计模式)。

基本上,我想拥有一个工作队列:我有多个创建工作的客户端(发布者),以及许多处理这些工作的工人(消费者)。现在,我想将发布者创建的作业分发给各个使用者,这基本上可以使用几乎任何消息队列并在整个队列中实现负载均衡,例如使用RabbitMQ甚至MQTT 5。

但是,现在事情变得复杂了……每个工作都指向一个外部实体,例如一个用户。我想要的是按顺序处理单个用户的作业,但并行处理多个用户的作业。我不要求用户X的作业始终去工作者Y,因为无论如何它们都应按顺序处理。

现在,我可以使用RabbitMQ及其一致的哈希交换来解决此问题,但是当新的工作人员进入集群时,我就会进行数据竞赛,因为RabbitMQ不支持重新定位已经在队列中的作业。

MQTT 5也不支持:在这里,这个想法被称为“粘性共享订阅”,但这不是官方的。它可能是MQTT 6的一部分,也可能不是。谁知道。

我也看过NSQ,NATS和其他一些经纪人。他们中的大多数甚至都不支持这种非常特定的情况,而那些确实使用一致哈希的情况,则存在前面提到的数据竞速问题。

现在,如果代理在作业到达后不将作业分类到队列中,而是跟踪某个特定用户的作业是否已经在处理中,则问题将消失:如果这样,它将延迟所有其他作业该用户,但其他用户的所有作业仍应处理。使用RabbitMQ等人无法做到这一点。

我很确定我不是唯一拥有用例的人。例如,我可以想到用户将视频上传到视频平台,尽管上传的视频是并行处理的,但单个用户上传的所有视频都是按顺序处理的。

因此,简而言之:我所形容的名字是用一个普通名字吗?诸如分布式作业队列之类的东西?具有任务相似性的任务调度程序?还是其他?我尝试了很多术语,但没有成功。这可能意味着没有解决方案,但是如上所述,很难想象我是这个问题上唯一的人。

有什么想法我可以寻找吗?并且:是否有实现此目的的工具?有协议吗?

PS:仅使用预定义的路由密钥是不可行的,因为用户ID(我在这里只是作为一个示例)基本上是UUID,因此可以有数十亿个,因此我需要更多动态的东西。因此,一致性哈希基本上是正确的方法,但是如上所述,为了避免数据争用,分发必须逐个进行而不是预先进行。

distributed design-patterns message-queue dispatcher job-queue

9
推荐指数
2
解决办法
474
查看次数