2008-08-05 85 views

回答

3

如果数据修改不是太耗时(即,如果后台线程的主要目的不是实际的数据修改),请尝试将修改数据的部分移动到委托并调用该委托。

如果实际繁重的工作在数据上,您可能需要创建此数据的深层副本以传递给后台线程,后台线程将再次通过Invoke将处理后的数据发送回UI线程。

您将只需要移动将数据更改为委托函数的代码(因为数据更改是触发控件更新的原因)。除此之外,你不应该写任何额外的东西。

3

你应该能够做这样的事情:

if (control.InvokeRequired) 
{ 
    control.Invoke(delegateWithMyCode); 
} 
else 
{ 
    delegateWithMyCode(); 
} 

InvokeRequired是控制属性,看看你是否在正确的线程,然后调用将调用在正确的线程的委托。

UPDATE:其实,在我上一份工作,我们做了这样的事情:

private void SomeEventHandler(Object someParam) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam); 
    } 

    // Regular handling code 
} 

这消除了对其他模块的需要,那种收紧的代码。

1

因为我没有测试用例,所以我不能保证这个解决方案,但在我看来,类似于用于更新不同线程中的进度条的场景(使用委托)将会适合在这里。

public delegate void DataBindDelegate(); 
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind); 

public void DoDataBind() 
{ 
    DataBind(); 
} 

如果数据绑定需要由特定线程完成,那么让该线程完成工作!

0

如果线程调用是“非法”的(即DataBind调用会影响在线程中没有创建的控件,那么它将被调用),那么您需要创建一个委托,以便即使DataBind的决策/准备不是在控制创建线程中完成的,它们的任何结果修改(即DataBind())将会是。

你会调用从辅助线程我的代码如下所示:

this.BindData.Invoke(); 

这将进而导致原来的线程做绑定,这(假定它是创建控件的线程)应该工作。

0

在WPF和Silverlight中,绑定基础结构负责切换到UI线程。