あなたは「クラッシュ」のアプリケーションの外観を与えるUIスレッド上のブロッキング呼び出しを実行しています。
別のスレッドを使用するか、非同期で処理する必要があります。バックグラウンドワーカーは出発点かもしれません。
private BackgroundWorker bgw = new BackgroundWorker();
public MainWindow()
{
InitializeComponent();
bgw.DoWork += Bgw_DoWork;
bgw.RunWorkerCompleted += Bgw_RunWorkerCompleted;
bgw.WorkerSupportsCancellation = true;
}
private void button3_Click(object sender, EventArgs e)
{
if (!bgw.IsBusy)
{
bgw.RunWorkerAsync();
((Button)sender).Content = "Cancel";
}
else
{
bgw.CancelAsync();
}
}
private void Bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
button.Content = "Start";
}
private void Bgw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
var server = new TcpListener(IPAddress.Any, 619);
server.Start();
while (true)
{
if (worker.CancellationPending)
{
e.Cancel = true;
server.Stop();
break;
}
else
{
if (server.Pending())
{
var client = listener.AcceptTcpClient();
// handle client here or do something like below to return the client to the RunWorkerCompleted method in
// e.result
e.Result = client;
break;
}
}
}
}
は、他のそのようなserver.AcceptTcpClientAsyncを(使用などのオプション)の代わりにポーリングserver.Pending()プロパティがあります。また、この間にThread.Sleepを使用せずにこのようにポーリングを行うと、プロパティが頻繁にチェックされ、サイクルが浪費されてしまうという過酷な状態になる可能性があります。
これに続いて、アプリケーションに合った方法でクライアントを処理する方法を理解する必要があります。 1クライアントあたり1クリックは受け入れられますか?リスナをキャンセルするまで、新しい接続を永遠に処理しますか?プロセス_terminates_、一般的にスローされた例外のようなエラーメッセージのいくつかの特定の種類(とが、非常にまれ過程ます:など幸運
BackgroundWorker tutorial
AcceptTcpClientAsync MSDN
A「クラッシュ」は非常に具体的なものです警告なしでただ終了する)。あなたは本当にクラッシュしていますか?あなたがしていない場合、それは 'AcceptTcpClient()'メソッドが返されていないことだけです、あなたは**全く問題はありません**。そうした場合は、問題を確実に再現し、これまでデバッグするために行ったことを説明する良い[mcve]を提供してください。 –