我正在构建一个WPF应用程序.我正在与服务器端进行一些异步通信,我在客户端上使用Prism进行事件聚合.这两件事导致产生新的线程,而不是UI线程.如果我尝试在这些回调和事件处理程序线程上执行"WPF操作",那么世界将会崩溃,现在它已经开始了.
首先,我遇到了尝试在服务器回调中创建一些WPF对象的问题.我被告知线程需要在STA模式下运行.现在我正在尝试更新Prism事件处理程序中的一些UI数据,我被告知:
调用者无法访问此线程,因为另一个线程拥有它.
所以; 在WPF中解决问题的关键是什么?我在这篇MSDN帖子中读到了WPF Dispatcher .我开始明白了,但我还没有巫师.
有人想帮我清理一下吗?任何相关的建议等?谢谢!
在我的WPF应用程序中,我需要执行异步操作,然后我需要更新GUI.这件事我不得不在不同的时刻做不同的操作.我知道两种方法:Dispatcher和BackgroundWorker.
因为当我选择它时我会很难回去,我问你:什么更好?选择一个而不是另一个的原因是什么?
谢谢!Pileggi
任何人都知道如何从中返回值Dispatcher.Invoke在wpf?我想返回ComboBox的选定索引.
谢谢!
我从视图模型类更新列表框有问题.我使用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) 在Akka文档中,它指出如果未配置调度程序,将使用默认调度程序.默认调度程序的属性是什么,即parallelism-min,parallelism-factor,parallelism-max等?
我已经使用了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) 是否System.Windows.Threading.Dispatcher适用于WinForms应用程序的UI线程?
如果是,为什么?它来自WindowsBase.dll,它似乎是一个WPF组件.
如果没有,我如何调用工作单元回到UI线程?我发现Control.BeginInvoke(),但创建一个控件只是为了引用原始线程似乎很笨拙.
我尝试使用以下代码在导航到下一个窗口之前延迟2秒.但线程首先调用,文本块显示一微秒并进入下一页.我听说调度员会这样做.
这是我的片段:
tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
Run Code Online (Sandbox Code Playgroud) 我很困惑为什么我不能让这个测试计数器应用程序使用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) 我有一个无效的跨线程访问问题,但有一点研究,我设法通过使用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 之间有区别吗?
dispatcher ×10
wpf ×5
c# ×4
invoke ×3
begininvoke ×2
.net ×1
akka ×1
asynchronous ×1
bitmapimage ×1
java ×1
performance ×1
return ×1
scala ×1
silverlight ×1
thread-sleep ×1
volatile ×1
wcf ×1
winforms ×1