13
A
回答
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线程。
相关问题
- 1. 非法跨线程操作异常,无法处理它
- 2. 如何解决跨线程操作
- 3. 跨线程操作异常的规则?
- 4. 跨线程操作无效AMD试图找到一个解决方案
- 5. 多线程解决方案
- 6. IE11:渲染表中性能非常差 - 任何解决方案?
- 7. 异常在线程“主”java.util.NoSuchElementException无法找到我的情况的解决方案
- 8. Java堆空间异常,大量数据,任何解决方案?
- 9. WPF解决方案非常奇怪
- 10. 异常跟踪解决方案
- 11. 跨线程异常
- 12. 操作系统:Peterson的解决方案
- 13. 如何解决“跨线程操作无效”问题?
- 14. 如何解决“跨线程操作无效”?
- 15. 如何解决此异常:线程“main”中的异常java.lang.ClassCastException
- 16. 路径操作解决方案?
- 17. 内部控件的“跨线程操作无效”异常
- 18. 针对Firebase异常的任何解决方法NoClassDefFoundError:LLRBNode $ NodeVisitor
- 19. 如何解决这个异常:线程“主”异常java.lang.ArrayIndexOutOfBoundsException
- 20. 阿贾克斯得到调用 - 跨站,任何解决方案?
- 21. 调用目标投掷无效跨线程操作异常
- 22. sqlite4java多线程支持解决方案
- 23. 跨越不同解决方案的msbuild
- 24. jQuery的跨浏览器解决方案
- 25. 插入MULTILINESTRING的任何解决方案?
- 26. 跨线程异常抛出
- 27. 跨线程调用异常
- 28. 解决Dispose方法中的异常
- 29. 带路由的离线OpenStreetMaps的任何解决方案?
- 30. 跨多个解决方案常见的JavaScript文件