c#和.NET中的gui实现方法

时间:2010-09-29 06:31:34

标签: c# .net user-interface datagridview shared-memory

我是C#和.NET的完全乞丐 我应该在C#中为后端进程实现GUI 我需要遵循的设计是使用数据网格来显示数据,当用户点击行时,会出现其他表示。例如。数据图 gui由一个过程管理,例如ProcessA。另一个过程,例如ProcessB,处理和与远程服务通信生成将在gui中显示的数据 ProcessB和ProcessA通过共享内存进行通信。即ProcessB在看到更新(通过脏位)更新时更新共享内存和ProcessB 网格中相应的数据行 我的问题是:

  1. 这种设计是.NET和这种情况下GUI的常用方法吗?我问,因为我个人根本不喜欢它,并且想知道我是不是不喜欢它。

  2. 如果需要快速更新GUI,是否有更好的设计?例如。 ProcessA和ProcessB应该只是一个过程吗?

  3. 这个设计是否可以在C#中实现?即通过共享内存更新数据网格?因为,我google了一下,似乎大多数教程都描述了数据网格绑定到数据源(用于db访问或xml文件读取)

  4. 在C#中gui是否完全更新,即每次更新行时都会完全重绘?在这种情况下是使用脏位来知道更新共享内存的哪一部分以便更新gui的相应部分,没用?

  5. 是否可以以某种方式创建一个gui,以便每次共享内存更改时自动更新?

  6. 更新: ProcessA和ProcessB在同一台计算机上

    谢谢

3 个答案:

答案 0 :(得分:0)

  1. 使用GUI与WCF服务通信是很常见的。如果这就是ProcessA和ProcessB的意思。
  2. 您可以使用单个流程但是,您已经有了要求......
  3. 您可以更新ArrayList或类似的东西,然后将其用作数据源
  4. 不,我不这么认为
  5. 嗯,你必须确切地知道更新发生的时间并为此创建一个事件。因此,您的数据源将被更新,您的数据网格也将更新

答案 1 :(得分:0)

  1. 您可以使用EventWaitHandle 在进程之间发出信号,或者 使用WCF。在。之间发送数据 通过共享内存的进程是 肯定是最快的方式,但是WCF 可能更好。 (为了速度检查我的 blog post
  2. 如果你可以在同一个过程中拥有它们,那么它可能是一个好主意,并且只有单独的线程
  3. 是和否。您可以通过共享内存(使用内存映射文件)传递数据,然后需要将数据反序列化为可以绑定到数据网格的托管对象。然后,您可以在内存映射文件的顶部创建一个读取器/列表,它在绑定到网格时一次读取和反序列化一个元素。
  4. 如果您可以检测哪些数据已更改并且仅更新该gui部分,那么这是一种很好的方法。如果您在共享内存中使用脏位,或者在WCF中使用具有不同数据上的回调方法的双工绑定公开更丰富的服务层,那么这更像是一种设计选项。
  5. 通过信号,您可以实现这一目标。服务器发出信号已发生变化的信号,客户端接收信号并相应更新。
  6. 通常,具有已定义接口和方法的客户端/服务器方法会创建更清晰的代码,并且您知道每个部分的功能。使用共享内存和例如信令会产生更紧密的耦合,并且读取代码不会立即告诉您发生了什么,因为它更复杂(在我个人看来)。也就是说,如果速度是最大的,我的意思是最重要的,使用共享内存。如果没有,请使用双工服务合同进行WCF和命名管道绑定。它干净,可重复使用。

答案 2 :(得分:0)

按过程你的意思是线程吗?或者我们在谈论GUI和Windows服务?

如果您正在使用线程,共享内存就可以了。如果它们是实际进程,则“正确”方法是在命名管道上创建WCF服务以进行机器进程间通信。 (这也使得移动过程非常简单)。这样,您可以使用双工(双向)WCF绑定在数据更改时更新您的Gui。

通过事物的声音,你需要线程而不是进程。在.NET中,有一个名为BackgroundWorker的类,它专为此类场景而设计。需要注意的重点是,如果需要从后台线程更新gui,则需要使用Gui线程调度程序。 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

这可能是一个学习曲线,但我强烈建议你研究使用WPF和MVVM来做到这一点。它是一个gui框架,非常适合绑定到动态数据。