我在Windows窗体应用程序(.NET C#4)中托管了WCF服务。这运行在它自己的线程上。当在WCF服务上调用方法时,我想更新List(即List),然后Form中的ListView向显示添加一行。
实现这一目标的最佳方式是什么?
答案 0 :(得分:1)
在Windows下,控件必须在主应用程序或GUI线程中更新,而不是您怀疑的工作线程。主要原因是控件使用 Windows消息泵,必须由主线程处理。
从非工作线程中的线程编组数据的非UI线程更新控件到UI线程;在.net这是一件容易的事。您创建一个委托回调方法,该方法通过 BeginInvoke ()或调用()调用,这些方法是异步和同步分别。
myListBox.BeginInvoke(new MyDelegate(DelegateMethod), "hi there");
public void DelegateMethod(ListView myControl, string message)
{
myControl.Items.Add (message);
}
根据您的性能需求,您可能希望使用 BeginInvoke ()在后台完成更新,而不是调用()来阻止工作线程。但要考虑的一件事是,如果你每个时间间隔执行太多 BeginInvoke (),它会阻碍你的应用程序的性能,因为Windows消息泵会被打乱,更不用说某些消息可能会丢失。但实际上,你需要做很多事情来实现这一点,并且它与任何其他性能要求密切相关。
希望一切顺利this article进一步描述了这一点。