0

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);
        }
    }

このリスナーは、シェル ビュー モデルにインポートされました。うまくいきます。

WPF ウィンドウを閉じると、MEF はこのオブジェクトを破棄しません。Windows は閉じますが、プロセスはまだ実行中です。この「サーバー」を適切にシャットダウンするにはどうすればよいですか? それは待っていvar clientます..

4

3 に答える 3

1

すべてのフォアグラウンド スレッドが完了するまで、プロセスは終了しません。

この場合、新しいスレッドを開始しているので、それをバックグラウンド スレッドにすることができます。

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

バックグラウンド スレッドはプロセスを維持しません。

于 2012-06-22T21:41:28.243 に答える
0

クラスを実装としてマークし、実装にフラグIDisposableを設定します。次に、次のように接続を受け入れるループを変更します。disposedDispose

    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);
        }
    }

DisposeMEFは、アプリケーションの終了時にMEFコンテナー自体を破棄することを条件として、作成した使い捨てコンポーネントの呼び出しを処理します。

于 2012-06-22T22:12:13.487 に答える
-1

無限ループで止まらない。ループが停止し、スレッドが戻って適切に停止するように、フラグ、ミューテックスなどを使用する必要があります。

于 2012-06-22T21:42:22.080 に答える