从后台更新UI线程
这只是一个奇怪的问题。哪一个是从另一个线程更新UI的最佳方式。首先,这一个:从后台更新UI线程
private delegate void MyDelegateMethod();
void MyMethod()
{
if (unknowncontrol.InvokeRequired)
{
this.BeginInvoke(new MyDelegateMethod(MyMethod));
return;
}
unknowncontrol.property = "updating!";
}
在另一方面:
Invoke((System.Threading.ThreadStart)delegate()
{
unknowncontrol.property = "updating!";
});
或者,有没有更好的方式来做到这一点?
当然这是用于WinForms,对于WPF还有调度器。 WPF代码如何?
我在问,因为过去我在使用上述两个选项更新UI引发事件时遇到错误。这种错误类似于:“没有可用的源代码”。我认为我们所有人都看过他们:D。
谢谢,祝你有美好的一天!
退房罗伊Osherove的博客文章在这:http://osherove.com/blog/2006/3/1/the-3-ways-to-create-a-thread-safe-gui-with-net-20-with-one.html
delegate void Func<T>(T t);
Func del = delegate
{
// UI Code goes here
};
Invoke(del);
我通常使用第一个模型,但那只是因为我发现它更清晰。两者之间并没有真正的区别。
正如我所看到的,最好的方法是设置ui元素的属性绑定到的CLR属性。
第一种方法(的BeginInvoke)确保UI更新代码执行创建控制在同一线程上。第二种方法没有。让所有UI更新代码在同一个线程上执行,避免了大量的线程问题,并允许您使用不一定是线程安全的控件。
默认Action委托的工作90%的时间:
private void Log(String value)
{
// Verify that we're on the same thread
if (textBox1.InvokeRequired)
{
// We're not on the same thread - Invoke the UI thread
textBox1.Invoke(new Action<string>(Log), value);
return;
}
// We're on the same thread - Update UI
textBox1.Text += value + "\r\n";
}
private void OnSomethingHappened()
{
Log("Something happened!");
}
使用[Dispatcher.Invoke(DispatcherPriority, Delegate)]到UI从另一个线程或背景变化。
步骤1。使用下面的命名空间
using System.Windows;
using System.Threading;
using System.Windows.Threading;
步骤2。将下面的线,你需要更新UI
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate
{
//Update UI here
}));
语法
[BrowsableAttribute(false)] public object Invoke( DispatcherPriority priority, Delegate method )
参数
priority
类型:
System.Windows.Threading.DispatcherPriority
优先级相对于 Dispatcher事件队列中的其他未决操作,将调用指定的方法。
method
类型:
System.Delegate
代表对不带参数的方法,其被压入 分派事件队列。
返回值
类型:
System.Object
从委托的返回值被调用或NULL,如果 委托没有返回值。
版本信息
可用,因为.NET Framework 3.0的
你做这件事究竟是如何你应该。在未来发布实际的代码,如果你想反馈。 –
如果您的某些代码存在问题,请发布该代码。我从来没有见过“没有可用的源代码”错误。如果您的意思是当您尝试查看某种框架方法的代码时VS给出的消息,那不是错误。引发异常的实际消息是重要的一点。 – svick
从UI线程调用Control.Invoke()或Control.BeginInvoke()是否有任何性能损失?我使用第一种模式,因为如果没有必要,它不会打扰Invoke调用。 – harlam357