2016-08-26 5 views
8

.NETコアで試してみたところ、ローカルのTCPサーバーに接続しようとしました。同期しても問題はありません(最初にConnectメソッドを参照)。私がasync/await(二番目のConnectAsyncメソッドを参照)でそれをやろうとすると、それは狂ってしまい、ほぼundebuggableになります。 TcpClientを正しく使用すると、ウェブ上でまだ利用可能な例がないので、私は訴えません。正確な問題はTcpClient.GetStreamを呼び出した後に始まります。私はJustMyCodeを無効にしてデバッグしようとしましたが、Visual StudioコードではAll exceptionsチェックボックスにチェックしましたが、TcpClient.GetStreamにジャンプしません。 asyncモードで.NETコア:asyncを使用するとTcpClient.GetStreamがクラッシュする

観察:

  • は、時にはそれはTcpClient.GetStreamにクラッシュ直接
  • 時にはそれが(私は最後Console.WriteLineが時々コンソールに表示されました)
  • プログラムすぐに呼び出し元の関数が戻った後にクラッシュしますデバッガはシャットダウンします(例外はスローされません)
  • 戻りコードは常に0(The program 'bla' has exited with code 0 (0x00000000)
  • です。

私のシステム/プロジェクトの設定:

  • のWindows 10 64ビット(教育)
  • .NETのコア1.0.0
  • コンソールアプリケーション
  • ローカルTCPサーバ、したがって、何の接続が
  • を発行していません
  • Visual Studioコード(重要ではない)

Co de:

+0

私は接続(非非同期)バージョンに困惑しています。接続している間に接続して、今すぐストリームを取得しようとします。接続するだけでストリームを取得することができます。 – BugFinder

+0

ConnectAsyncは同じインスタンスで1回または複数回呼び出されますか? – Guillaume

+2

スローされた例外を取得しようとしましたか?多分それはヒントを与えるでしょう。あなたがこれを分かち合うことができれば良いだろう。 – Nitram

答えて

4

説明している問題は、アプリケーションのメインスレッドが死んでいることを示しています。その問題を正しく特定するには、特定の瞬間にアクティブなスレッドとアプリケーション全体を調べなければなりません。

たとえば、メインのサブが終了するとすぐに、単純なコンソールアプリケーションが終了します。 ConnectAsync関数の呼び出し方法によっては、メインループが終了しないことを保証するものがないかもしれません。メインエントリポイントがasyncファンクションでないことを確認します。これは、最初に到達するとすぐに終了するため、awaitです。

2つの方法の主な違いは、関数のように呼び出されたスレッドをブロックするのではなく、実際にスレッドを切り替える可能性が高く、2番目の部分を別のスレッドで実行することです。

説明している動作を正確に説明しています。

await _client.ConnectAsync(host, port); 

行が実行されると、アプリケーションのメインループが終了し、.NET VM全体がシャットダウンします。

+0

ありがとうございました!私が 'ConnectAsync'をどのように呼び出すかを知らなくても、これを得ることを尊重してください。解決策は、単にエントリポイントが 'ConnectAsync'を呼び出す関数呼び出しの結果を待つようにすることでした。 –

関連する問題