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