2013-10-25 142 views
3

我正在構建一個非常簡單的服務器,它必須在.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()?

回答

8

你正在使這比它需要更難。

  1. 不要創建線程來啓動ServiceHostServiceHost將在服務調用內部管理自己的線程。創建一個新線程僅用於啓動ServiceHost沒有任何優勢。此外,您的客戶端Connect()呼叫將不會成功,直到ServiceHost初始化並正在運行。所以需要在server.Start()client.Connect()之間進行同步。新線程不會節省任何東西。

  2. 除非您有很好的理由,否則不要在C#中執行終結器。 ~Server()是一個壞主意。

所以完全擺脫Server類。包裝器不會爲你購買任何東西(除非你在配置管理中沒有在發佈的代碼中顯示)。

MyForm()中創建服務主機並在MyForm_FormClosed()中調用host.Close()。完成。

+0

擺脫「服務器」類是有道理的。我最初創建線程是因爲我的應用程序在我嘗試從我的「客戶」類中調用「ServiceHost」時鎖定了。我想我可能對線程的使用缺乏一些理解。謝謝@ErnieL! –