簡體   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