2011-10-31 126 views
0

这只是一个奇怪的问题。哪一个是从另一个线程更新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。

谢谢,祝你有美好的一天!

+0

你做这件事究竟是如何你应该。在未来发布实际的代码,如果你想反馈。 –

+1

如果您的某些代码存在问题,请发布该代码。我从来没有见过“没有可用的源代码”错误。如果您的意思是当您尝试查看某种框架方法的代码时VS给出的消息,那不是错误。引发异常的实际消息是重要的一点。 – svick

+0

从UI线程调用Control.Invoke()或Control.BeginInvoke()是否有任何性能损失?我使用第一种模式,因为如果没有必要,它不会打扰Invoke调用。 – harlam357

回答

0

我通常使用第一个模型,但那只是因为我发现它更清晰。两者之间并没有真正的区别。

0

正如我所看到的,最好的方法是设置ui元素的属性绑定到的CLR属性。

0

第一种方法(的BeginInvoke)确保UI更新代码执行创建控制在同一线程上。第二种方法没有。让所有UI更新代码在同一个线程上执行,避免了大量的线程问题,并允许您使用不一定是线程安全的控件。

0

默认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!"); 
} 
0

使用[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的