繁体   English   中英

通过MEF导出类时如何正确退出带有循环的后台线程?

[英]How to properly exit background thread with loop when class exported via MEF?

我实现了充当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 ..

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

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

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

后台线程将无法使进程继续运行。

你的类为实现IDisposable ,并设置一个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容器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM