线程,Winforms,从主窗口窗体分离TCP操作
本文关键字:分离 TCP 操作 窗体 Winforms 线程 窗口 | 更新日期: 2023-09-27 18:06:26
在我的主窗口表单中,我有一些TCP/IP的东西在运行。我目前正在重构,所以所有东西都在单独的类中。我把这些函数分开了(TCP现在由一个名为Communicator的类处理),但我只是注意到
this.Invoke(PDDelegate, new Object[] { tempstr });
这部分依赖于Form类中的一些基础结构。这是设置委托来处理通过TCP管道到达的数据。
当我调用Communicator时,我想传入一个对主窗口的引用。连接,所以我可以输入
window.Invoke(PDDelegate, new Object[] { tempstr });
但这对我来说就像是一个黑客。我想知道我是否应该担心这一点,并找出如何给这个对象的能力来处理自己的线程,或者只是在指针传递。
也许更好的方法是采用。net事件模型。让Communicator
类实现一个事件,并让表单订阅该事件。这样,你们就有了明确的职责划分。
:
public delegate void CommEventHandler(object sender, CommEventArgs e);
public event CommEventHandler CommEvent;
然后Communicator在适当的时候抛出comment。
在表单中,创建通信器并订阅事件:
private Communicator Comm = new Communicator();
Comm.CommEvent += MyCommEventHandler;
如果表单需要更新UI,那么它应该根据需要调用Invoke
。
对,这是一个hack。
对于套接字通信,我推荐基于SynchronizationContext
的方法。例如,Nito.Async.Sockets库使用SynchronizationContext
将结果封送回UI线程,而无需创建对Windows窗体的依赖。
或者,您可以基于Rx编写自己的包装器。我认为这是个好主意,但更复杂。