标签: dispatcher

不能在WP7上使用调度程序

我正在寻找使用调度程序在UI线程上调用代码的参考,他们说这样做:

Dispatcher.BeginInvoke(() => {OnSendSuccessful(); });
Run Code Online (Sandbox Code Playgroud)

但是我收到编译器错误,说我无法在静态上下文中访问非静态方法BeginInvoke.有任何想法吗?我试图新建一个调度员,但这甚至没有意义.

dispatcher windows-phone-7

25
推荐指数
1
解决办法
6598
查看次数

WPF中的Dispatcher to Thread关系

我不完全清楚应用程序中有多少Dispatchers以及它们与Threads相关或引用的方式.

据我所知,WPF应用程序有2个线程(一个用于输入,另一个用于UI)和1个调度程序(与UI-Thread相关联).如果我创建另一个线程 - 让我们称之为"工作线程" - 当我调用Dispatcher.CurrentDispatcher工作线程时,我会得到哪个调度程序怎么办?

另一种情况:假设一个带有2个线程的控制台应用程序 - 主线程和输入线程.在主线程上,我首先创建输入线程,然后我调用Application.Run()

Thread thread = new Thread(new ThreadStart(UserInputThreadFunction));
thread.Start();
Application.Run();
Run Code Online (Sandbox Code Playgroud)

会有一个调度员,对吗?在输入线程上,Dispatcher.CurrentDispatcher是否返回主线程的调度程序?或者将实例提供给主线程调度程序的正确方法是什么?

可能是WPF应用程序中有多个调度程序吗?有没有,创建另一个调度员是有意义的吗?

.net c# wpf dispatcher

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

找不到WebApplicationContext:没有注册ContextLoaderListener?

我正在尝试创建一个简单的Spring 3应用程序并具有以下文件.请告诉我这个错误的原因

下面是我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">
    <display-name>Spring2</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)

下面是我的index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Insert title here</title>
    </head>
    <body>
        Index Page<br/>
        <form:form commandName="loginBean" method="POST" action="login">
            <form:input path="userName" id="userName"/><br/>
            <form:input path="password" id="password"/><br/>
            <input type="submit" value="submit"/>   
        </form:form> …
Run Code Online (Sandbox Code Playgroud)

spring web.xml spring-mvc dispatcher

24
推荐指数
1
解决办法
11万
查看次数

使用default-dispatcher未配置Akka :: dispatcher [%name%]

我创建了followind application.conf:

akka {

    actor {

        prio-dispatcher {
            type = "Dispatcher"
            mailbox-type = "my.package.PrioritizedMailbox"
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

转储配置时

actorSystem = ActorSystem.create()
println(actorSystem.settings)
Run Code Online (Sandbox Code Playgroud)

我得到了输出:

        # application.conf: 5
        "prio-dispatcher" : {
            # application.conf: 7
            "mailbox-type" : "my.package.PrioritizedMailbox",
            # application.conf: 6
            "type" : "Dispatcher"
        },
Run Code Online (Sandbox Code Playgroud)

后来

[WARN] [08/30/2012 22:44:54.362] [default-akka.actor.default-dispatcher-3] [Dispatchers] Dispatcher [prio-dispatcher] not configured, using default-dispatcher
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

UPD这里找到解决方案,不得不使用名称"akka.actor.prio-dispatcher"

configuration dispatcher akka

23
推荐指数
1
解决办法
7621
查看次数

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

使用C#Dispatcher

我正在建立一个聊天客户端,并不是100%肯定如何使用dispatcher.所以问题是我有一个方法:

public void LostConnection()
{
    myGUI.chatBox.AppendText("Lost connection to room: "+ myGUI.UsernameText.ToString() + "\r\n");
}
Run Code Online (Sandbox Code Playgroud)

我是否需要(myGUI.chatBox... )用一个Dispatcher.Invoke?我感谢任何帮助.

c# wpf invoke dispatcher

22
推荐指数
1
解决办法
7万
查看次数

调用线程无法访问此对象,因为另一个线程拥有它.WPF

每当我刷新标签时,我都会收到此错误: 调用线程无法访问此对象,因为另一个线程拥有它.我试图调用,但它失败了.我正在使用WPF表格.

delegate void lostfocs(string st);
   private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {

        Thread t = new Thread(modi);
        t.Start();
    }
 void modi()
    {
        try
        {
            label1.Content = "df";
        }
        catch
        {
            lostfocs ld = new lostfocs(up);
          //  ld.Invoke("df");
            object obj=new object();
            ld.Invoke("sdaf");
        }
    }
void up(string st)
    {
        label1.Content = st;
    }
Run Code Online (Sandbox Code Playgroud)

.net c# wpf multithreading dispatcher

22
推荐指数
3
解决办法
5万
查看次数

WPF Dispatcher.Invoke'hanging'

我有一个有点复杂的WPF应用程序,当尝试使用调度程序在UI线程上调用调用时,似乎是"挂起"或卡在Wait调用中.

一般过程是:

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

    if(this.Dispatcher.Thread != Thread.CurrentThread)
    {
        this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{
            this.Name = value; // Call same setter, but on the UI thread
        });
        return;
    }

    SetValue(nameProperty, value); // I have also tried a member variable and setting the textbox.text property directly.
Run Code Online (Sandbox Code Playgroud)

我的问题是,当调用 dispatcher invoke方法时,它似乎每次都挂起,并且callstack指示它处于休眠状态,等待或加入Invoke实现.

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

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

.net c# wpf invoke dispatcher

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

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

我对在代码中使用锁有一种非常糟糕的感觉,但现在WindowBase的Dispatcher存在,我想在任何地方使用它.

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

但我的问题是这个Dispatcher与WPF结合在一起,所以当我到处使用它时我感到有点内疚,我觉得调度程序不是为我的用例而创建的.

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

谢谢,

更新

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

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

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

当我从UI访问存储库时,后台工作人员会有意义.

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

wpf multithreading dispatcher

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

WPF Dispatcher.BeginInvoke和UI /后台线程

我想我需要对WPF Dispatcher.InvokeDispatcher.BeginInvoke用法做一些澄清.

假设我有一些长时间运行的"工作"代码,就像在简单的WPF应用程序中按下按钮一样:

longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
    {
    Console.WriteLine("Starting Work Action");
    int i = int.MaxValue;
    while (i > 0)
        i--;
    Console.WriteLine("Ending Work Action");
    longWorkTextBox.Text = "Work Complete";
    };
longWorkTextBox.Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction);
Run Code Online (Sandbox Code Playgroud)

此代码在执行workAction时锁定了我的用户界面.这是因为Dispatcher调用总是在UI线程上运行,对吧?

假设这样,配置我的调度程序在我的UI的单独线程中执行workAction的最佳做法是什么?我知道我可以在我的workAction中添加BackgroundWorker, 以防止我的UI锁定:

longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += delegate
    {
        Console.WriteLine("Starting Slow Work");
        int i = int.MaxValue;
        while …
Run Code Online (Sandbox Code Playgroud)

wpf user-interface multithreading dispatcher

18
推荐指数
1
解决办法
7万
查看次数