线程,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 });

但这对我来说就像是一个黑客。我想知道我是否应该担心这一点,并找出如何给这个对象的能力来处理自己的线程,或者只是在指针传递。

线程,Winforms,从主窗口窗体分离TCP操作

也许更好的方法是采用。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编写自己的包装器。我认为这是个好主意,但更复杂。