【发布时间】:2009-11-15 16:35:44
【问题描述】:
我确实已经搜索过答案,但找不到类似的东西......
我对 C# 还很陌生。我需要使用 WinForms 在 C# 中创建一个程序。它基本上有 2 个组件:UI,然后我需要一个永久侦听套接字 TCP 端口的进程。如果收到任何东西,那么我需要引发一个事件或类似的东西,以便我可以更新 UI。
问题:在程序运行时实现需要一直监听的进程的最佳方法是什么?
然后,当我收到消息时,如何通知 UI 需要更新?
谢谢!
【问题讨论】:
我确实已经搜索过答案,但找不到类似的东西......
我对 C# 还很陌生。我需要使用 WinForms 在 C# 中创建一个程序。它基本上有 2 个组件:UI,然后我需要一个永久侦听套接字 TCP 端口的进程。如果收到任何东西,那么我需要引发一个事件或类似的东西,以便我可以更新 UI。
问题:在程序运行时实现需要一直监听的进程的最佳方法是什么?
然后,当我收到消息时,如何通知 UI 需要更新?
谢谢!
【问题讨论】:
您可以使用TcpListener 来等待另一个线程上的传入连接。每次收到新连接时,创建一个新线程来处理它。使用 Control.Invoke 从非 UI 线程更新 UI。这是一个简短的例子:
public MainForm()
{
InitializeComponents();
StartListener();
}
private TcpListener _listener;
private Thread _listenerThread;
private void StartListener()
{
_listenerThread = new Thread(RunListener);
_listenerThread.Start();
}
private void RunListener()
{
_listener = new TcpListener(IPAddress.Any, 8080);
_listener.Start();
while(true)
{
TcpClient client = _listener.AcceptTcpClient();
this.Invoke(
new Action(
() =>
{
textBoxLog.Text += string.Format("\nNew connection from {0}", client.Client.RemoteEndPoint);
}
));;
ThreadPool.QueueUserWorkItem(ProcessClient, client);
}
}
private void ProcessClient(object state)
{
TcpClient client = state as TcpClient;
// Do something with client
// ...
}
【讨论】:
您可以使用TcpListener 类。文档中有一个示例。
【讨论】:
在启动时,您可以生成(创建)一个新线程,该线程在无限循环中侦听新消息。一旦收到消息,线程就可以更新一些共享资源(设置一个标志)。当然,如果您使用同步队列来传输消息,则可以使这更加复杂。或者通过 WCF(尽管这对于您的目的来说似乎有些矫枉过正)。
【讨论】:
这可能不是最好的方法,但它应该可以工作......
您可以在程序启动时在新线程中启动您的 TCP 侦听器代码...这样您就可以在 UI 停止执行其他操作时侦听 TCP 代码。当 TCP 线程中发生某些事情时,它必须通过某种事件或事件队列向 UI 线程发出信号。
现在,在接收到东西时更新 WinForms 对象方面,我相信只有创建 WinForms 控件的线程才能更新控件。因此,您还必须考虑到这一点。
这也是我之前遇到过的一个问题......在我当前的项目中,我做了我上面提到的......但是有相当多的线程同步才能让它工作。
【讨论】: