标签: dispatcher

确保在WPF中的UI线程上运行

我正在构建一个WPF应用程序.我正在与服务器端进行一些异步通信,我在客户端上使用Prism进行事件聚合.这两件事导致产生新的线程,而不是UI线程.如果我尝试在这些回调和事件处理程序线程上执行"WPF操作",那么世界将会崩溃,现在它已经开始了.

首先,我遇到了尝试在服务器回调中创建一些WPF对象的问题.我被告知线程需要在STA模式下运行.现在我正在尝试更新Prism事件处理程序中的一些UI数据,我被告知:

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

所以; 在WPF中解决问题的关键是什么?我在这篇MSDN帖子中读到了WPF Dispatcher .我开始明白了,但我还没有巫师.

  1. 当我需要运行我不确定将在UI线程上调用的东西时,总是使用Dispatcher.Invoke的关键是什么?
  2. 如果它实际上是在UI线程上调用的,它是否重要,我还是做Dispatcher.Invoke?
  3. Dispatcher.Invoke =同步.Dispathcher.BeginInvoke = async?
  4. Dispatcher.Invoke会请求UI线程,然后停止等待吗?是不良做法和风险较低的程序?
  5. 我怎样才能得到调度员?Dispatcher.CurrentDispatcher会不会给我代表UI线程的调度程序?
  6. 是否存在多个Dispatcher,或者"Dispatcher"与应用程序的UI线程基本相同?
  7. 和BackgroundWorker有什么关系?我什么时候使用它呢?我认为这总是异步的?
  8. 在UI公寓模式下运行在UI线程上运行的所有内容(通过调用)吗?即如果我有需要在STA模式下运行的东西 - Dispatcher.Invoke会足够吗?

有人想帮我清理一下吗?任何相关的建议等?谢谢!

.net wpf invoke dispatcher

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

WPF BackgroundWorker与Dispatcher

在我的WPF应用程序中,我需要执行异步操作,然后我需要更新GUI.这件事我不得不在不同的时刻做不同的操作.我知道两种方法:Dispatcher和BackgroundWorker.

因为当我选择它时我会很难回去,我问你:什么更好?选择一个而不是另一个的原因是什么?

谢谢!Pileggi

wpf multithreading dispatcher backgroundworker

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

如何使用Dispatcher.Invoke返回值?

任何人都知道如何从中返回值Dispatcher.Invoke?我想返回ComboBox的选定索引.

谢谢!

wpf return invoke dispatcher

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

XAML绑定BitmapImage ViewModel属性

我从视图模型类更新列表框有问题.我使用Caliburn Micro框架.我的情况在这里:

我在listbox上绑定了bindableCollection类型的属性:

视图模型中的代码:

private BindableCollection<UserInfo> _friends;

public BindableCollection<UserInfo> Friends
{
    get { return _friends; }
    set
    {
        _friends= value;
        NotifyOfPropertyChange(()=>Friends);
    }
}
Run Code Online (Sandbox Code Playgroud)

在视图模型中,我创建假的服务方法,将新的新数据作为List返回,并使用此数据更新属性Friends,它们在listbox上绑定.

我每隔3秒就在调度员计时器滴答事件中调用假服务方法.

 private static UserInfo FakeUser()
        {
            var user = new UserInfo
            {
                Age = "16",
                Emphasis = true,
                IdUser = "11542",
                IsBlocked = false,
                IsFriend = true,
                LocationInfo = new Location
                {
                    CityName = "TN",
                    IdCity = 123456,
                    IdRegion = 1246,
                    RegionName = "TN",
                },
                StatusInfo = new Status
                {
                    IdChat = 12,
                    IsLogged = true, …
Run Code Online (Sandbox Code Playgroud)

wpf multithreading dispatcher bitmapimage

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

什么是默认的Akka调度程序配置值?

在Akka文档中,它指出如果未配置调度程序,将使用默认调度程序.默认调度程序的属性是什么,即parallelism-min,parallelism-factor,parallelism-max等?

java scala dispatcher akka

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

c# - 易失性关键字使用与锁定

我已经使用了volatile,我不确定它是否有必要.我很确定锁定在我的情况下会有点过分.阅读这个帖子(Eric Lippert评论)让我对使用volatile感到焦虑:什么时候应该在c#中使用volatile关键字?

我使用volatile是因为我的变量在多线程上下文中使用,其中可以同时访问/修改此变量,但是我可以在没有任何伤害的情况下松散添加(参见代码).

我添加"挥发性",以确保有不发生未命中对准:在另一个取可以在2通过在从另一个线程中间的写入被打破仅读取32可变的比特和其他32位.

我先前的假设(先前的陈述)是否真的可以发生?如果没有,"挥发性"使用是否仍然是必要的(选项属性修改可能在任何线程中发生).

看了2个第一个答案.我想坚持代码编写方式的事实,如果由于并发性我们错过了一个增量(想要从2个线程递增但结果仅由于并发而增加1)并不重要变量'_actualVersion'递增.

作为参考,这是我正在使用它的代码的一部分.仅在应用程序空闲时报告保存操作(写入磁盘).

public abstract class OptionsBase : NotifyPropertyChangedBase
{
    private string _path;

    volatile private int _savedVersion = 0;
    volatile private int _actualVersion = 0;

    // ******************************************************************
    void OptionsBase_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        _actualVersion++;
        Application.Current.Dispatcher.BeginInvoke(new Action(InternalSave), DispatcherPriority.ApplicationIdle);
    }

    // ******************************************************************
    private void InternalSave()
    {
        if (_actualVersion != _savedVersion)
        {
            _savedVersion = _actualVersion;
            Save();
        }
    }

    // ******************************************************************
    /// <summary>
    /// Save Options
    /// </summary>
    private void Save()
    {
        using (XmlTextWriter writer = new XmlTextWriter(_path, null)) …
Run Code Online (Sandbox Code Playgroud)

c# performance multithreading volatile dispatcher

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

System.Windows.Threading.Dispatcher和WinForms?

是否System.Windows.Threading.Dispatcher适用于WinForms应用程序的UI线程?

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

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

multithreading dispatcher begininvoke winforms

28
推荐指数
3
解决办法
6万
查看次数

如何在WPF中执行操作之前放置延迟

我尝试使用以下代码在导航到下一个窗口之前延迟2秒.但线程首先调用,文本块显示一微秒并进入下一页.我听说调度员会这样做.

这是我的片段:

tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
Run Code Online (Sandbox Code Playgroud)

c# wpf dispatcher thread-sleep

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

Dispatcher Invoke(...)vs BeginInvoke(...)混淆

我很困惑为什么我不能让这个测试计数器应用程序使用Count()方法在我的Dispatcher上使用"BeginInvoke"的2个(或更多个)同时运行的反文本框.

您可以通过Invoke替换BeginInvoke来解决问题.但这并不能解决我的困惑.

这是我正在谈论的示例代码:

public class CounterTextBox : TextBox
{
    private int _number;

    public void Start()
    {
        (new Action(Count)).BeginInvoke(null, null);
    }

    private void Count()
    {
        while (true)
        {
            if (_number++ > 10000) _number = 0;
            this.Dispatcher.BeginInvoke(new Action(UpdateText), System.Windows.Threading.DispatcherPriority.Background, null);    
        }
    }

    private void UpdateText()
    {
        this.Text = "" + _number;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading invoke dispatcher begininvoke

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

了解Silverlight Dispatcher

我有一个无效的跨线程访问问题,但有一点研究,我设法通过使用Dispatcher修复它.

现在在我的应用程序中,我有延迟加载的对象.我使用WCF进行异步调用,像往常一样,我使用Dispatcher更新我的对象DataContext,但它不适用于这种情况.不过我在这里找到了解决方案.这是我不明白的.

在我的UserControl中,我有代码在我的对象上调用Toggle方法.对此方法的调用是在Dispatcher中,如此.

Dispatcher.BeginInvoke( () => _CurrentPin.ToggleInfoPanel() );
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,这还不足以满足Silverlight.我不得不在我的对象中进行另一个 Dispatcher调用.我的对象不是UIElement,而是一个处理所有自己的加载/保存的简单类.

所以问题是通过调用来解决的

Deployment.Current.Dispatcher.BeginInvoke( () => dataContext.Detail = detail );
Run Code Online (Sandbox Code Playgroud)

在我班上.

为什么我必须两次调用Dispatcher来实现这一目标?高级电话不应该足够吗?在UIElement中Deployment.Current.Dispatcher和Dispatcher 之间有区别吗?

c# silverlight wcf asynchronous dispatcher

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