0

我实现了用作 TcpCLient 服务器的类。看起来像这样:

{

[Export]
public class MessageListener
{
    private readonly TcpListener tcpListener;
    private readonly Thread listenThread;

    private DataRepository DataRepository { get; set; }

    private IEventAggregator EventAggregator { get; set; }

    [ImportingConstructor]
    public MessageListener(DataRepository dataRepository, IEventAggregator eventAggregator)
    {
        this.DataRepository = dataRepository;
        this.EventAggregator = eventAggregator;

        // TODO: Need to put proper Port number
        this.tcpListener = new TcpListener(IPAddress.Any, 3000);
        this.listenThread = new Thread(this.ListenForClients);
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        this.tcpListener.Start();

        while (true)
        {
            // blocks until a client has connected to the server
            var client = this.tcpListener.AcceptTcpClient();

            // create a thread to handle communication with connected client
            var clientThread = new Thread(this.HandleClientComm);
            clientThread.Start(client);
        }
    }

这个监听器导入到我的 Shell 视图模型中。效果很好。

当我关闭 WPF 窗口时 - MEF 不会处理此对象。Windows 关闭但进程仍在运行。如何正确关闭此“服务器”?它等待var client..

4

3 回答 3

1

在所有前台线程完成之前,该进程不会退出。

在这种情况下,由于您正在启动一个新线程,您可以将其设为后台线程:

this.listenThread = new Thread(this.ListenForClients);
this.listenThread.IsBackground = true;
this.listenThread.Start();

后台线程不会使进程保持活动状态。

于 2012-06-22T21:41:28.243 回答
0

将您的类标记为 implementation IDisposable,并在 implementation 中设置一个disposed标志Dispose。然后改变你的循环,你接受这样的连接:

    while (!this.disposed)
    {
        Thread.Sleep(1); // to avoid spinning a core 100%
        if (this.tcpListener.Pending)
        {
            // shouldn't block because we checked tcpListener.Pending
            var client = this.tcpListener.AcceptTcpClient();
            var clientThread = new Thread(this.HandleClientComm);
            clientThread.Start(client);
        }
    }

MEF 将负责调用Dispose它创建的任何一次性组件,前提是您在应用程序退出时处置 MEF 容器本身。

于 2012-06-22T22:12:13.487 回答
-1

它不会因为无限循环而停止。您需要使用标志、互斥锁或类似的东西,以便循环停止并且线程将返回并正确停止。

于 2012-06-22T21:42:22.080 回答