我正在構建一個非常簡單的服務器,它必須在.NET中使用命名管道,並且將運行在Windows窗體GUI後面。我已經能夠在'服務器'類(下面)中實現ServiceHost並使用'客戶端'類與它進行通信。我遇到的問題是找出合適的方法來關閉正在線程上運行的ServiceHost,並在窗體關閉時處理線程。我是新來的線程和命名管道,所以很好!
這是開始我的服務器/客戶端的形式:在C#中關閉/處理ServiceHost線程的正確方法?
public partial class MyForm : Form
{
Thread server;
Client client;
public MyForm()
{
InitializeComponent();
server = new Thread(() => new Server());
server.Start();
client = new Client();
client.Connect();
}
}
private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
// Close server thread and disconnect client.
client.Disconnect();
// Properly close server connection and dispose of thread(?)
}
這裏是服務器類:
class Server : IDisposable
{
public ServiceHost host;
private bool disposed = false;
public Server()
{
host = new ServiceHost(
typeof(Services),
new Uri[]{
new Uri("net.pipe://localhost")
});
host.AddServiceEndpoint(typeof(IServices), new NetNamedPipeBinding(), "GetData");
host.AddServiceEndpoint(typeof(IServices), new NetNamedPipeBinding(), "SubmitData");
host.Open();
Console.WriteLine("Server is available.");
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
host.Close();
}
disposed = true;
}
}
~Server()
{
Dispose(false);
}
}
是使用IDisposable的一個好的方法,我怎麼去c當我完成我的線程時處理Dispose()?
擺脫「服務器」類是有道理的。我最初創建線程是因爲我的應用程序在我嘗試從我的「客戶」類中調用「ServiceHost」時鎖定了。我想我可能對線程的使用缺乏一些理解。謝謝@ErnieL! –