2012-06-22 29 views
0

我實現了作爲TcpCLient服務器的類。看起來像這樣:如何通過MEF導出類時正確退出後臺線程?

{ 

[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 ..

回答

1

該過程將不會退出,直到所有前臺線程完成。

在這種情況下,因爲你開始一個新的線程,你可以讓後臺線程:

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

後臺線程不會保持過程活着。

-1

它無法停止,因爲無限循環。你需要使用一個標誌,一個互斥或類似的東西,以便循環停止,線程將返回並正確停止。

+0

它不循環,我不能使用標誌 - 它在特定的代碼行上等待客戶端 – katit

+0

儘管如此,它永遠不會熄滅,但如果您想要這樣,這並不是什麼大問題...... – Maresh

0

將您的班級標記爲實施IDisposable,並在Dispose實施中設置disposed標誌。然後改變你的循環,你接受連接這樣的:

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容器本身的應用程序退出時。