問題タブ [beginread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1805 参照

c# - C#TcpClientがパケットを失う

ネットワークコードのストレステストを実際に行うと、いくつかの問題が発生します。基本的に、ソケットが設定されると、これを呼び出します。

次に、以下は私の送信メソッドです

しかし、そうです、システムのストレステストを行ったある時点で(たとえば、500程度のクライアントが一度に大量のメッセージを送信する場合)、400万ごとに1つのパケットが受信されないことに気付きます。問題が送信にあるのか受信にあるのかわからないため、両方の方法を含めました。ただし、クライアントから別のパケットを送信することを選択した場合でも、正しく送受信されるため、キューに入れられているだけではないことを指摘しておきます。

誰かが私が欠けているものを見ることができますか?

0 投票する
2 に答える
4558 参照

c# - FileOptions.Asynchronous により FileStream.BeginRead がブロックされる

FileOptions.Asynchronous で FileStream を作成すると、FileStream.BeginRead が呼び出しスレッドをブロックするのはなぜですか?

コード スニペットは次のとおりです。

JetBrains dotPeek を使用して MSFT FileStream コードを掘り下げると、コードにバグがあるようです。

実際には、BeginRead メソッドは Task をスケジュールすることで非同期に読み取りを行っているように見えますが、BeginReadAsync メソッドは実際には同期読み取りを行っています。したがって、彼らのメソッド命名命名法は逆であり、どのメソッドが呼び出されるかのロジックは間違っています。this._isAsync == true の場合、BeginRead を呼び出す必要があります。

そのため、FileStream.BeginRead をすぐに返す (非同期的に読み取りをスケジュールする) には、実際には cosntructor の useAsync パラメータを false に設定する必要があるようです。

0 投票する
1 に答える
2636 参照

c# - 非同期 TcpClient が時間内にすべてのデータを読み取らない

以下のコードは、サーバーからのデータがそれほど多くない場合、またはデータが多くてThread.Sleep(500)行のコメントを外した場合に機能します。ただし、この行は使用したくありませんThread.Sleepが、削除すると、サーバーからすべてのデータを読み取る前にプログラムが終了します。問題は、EndRead()すべてのデータが読み取られるまでブロックされないことです。これは理解でき、 への再帰呼び出しで修正する必要がありますが、ReceiveCallbackそうではありません。

Linux で C/C++ を使用して作成されたクライアントが動作しています。私はそれを c# と .Net で動作させようとしています。Linux で .Net 4.0 で MonoDevelop を使用しています。これを修正する方法についての助けに感謝します。

0 投票する
1 に答える
7157 参照

c# - NetworkStream.BeginRead を使用して要求されたすべてのデータを読み取る方法は?

非同期サーバーのコードがあります。クライアントはヘッダーを送信します - データ ブロック + データ ブロックのサイズ。

サーバーは、最初にヘッダーを読み取り、次にデータ ブロックを非同期に読み取ります。

データブロックを読み取った後、スレッドを非同期にするために、ヘッダー読み取り部分の BeginRead を実行する必要があります。

問題:

私が DataCallBack を取得したとき、次のようになります。

int bytesRead = ns.EndRead(結果);

読み込むように要求したすべてのバッファを取得できません

mc.Client.GetStream().BeginRead(mc.DataBuffer, 0, size, new AsyncCallback(DataCallBack), mc);

クライアントが 1MB のデータを送信すると、異なる数の「bytesRead」を取得できます。

質問:

「BeginRead」に接続からすべてのデータを強制的に読み取る方法。ヘッダー - データの新しいループが発生するはずです。

MyClient - TcpClient の単なるラッパーです。

コード:

悪いコード - 読み取りが非同期になる - 同期

悪いコードを終わらせる

0 投票する
0 に答える
114 参照

vb.net - カスタム キューの非同期コールバック

「BeginRead」でTCPソケットを使用するクラスを書いています

私が見ているように、データが読み取られるたびに、データが読み取られるたびに、コールバック関数へのデリゲートがスレッドプール キューに配置されます (これは正しいですか?)。このコールバックを別のキューに配置できるかどうか疑問に思っていましたか?

私のプログラムには、独自のスレッドを持つ1つのワークキューがあります。したがって、すべてのイベントをこのキューに配置し、競合状態を発生させません。ここで、デリゲートがスレッドプールで呼び出されるようにし、すぐに新しいデリゲートを自分のキューに配置します。できれば避けたい一歩が多すぎます。

0 投票する
2 に答える
875 参照

vb.net - ワーカー スレッドからメイン (UI) スレッドに切り替える方法はありますか?

私の質問が長すぎる場合は、事前にお詫び申し上げます。「別のクラスのスレッドによって受信されているメッセージで GUI のデータを更新する方法は?」という質問を見ました。それは私がやろうとしていることに非常に近いですが、答えは役立つほど詳細ではありませんでした.

VB6 アプリを VB.NET (VS2013) に変換しました。アプリの主な機能は、クエリを Linux サーバーに送信し、結果を呼び出しフォームに表示することです。WinSock コントロールはもう存在しないので、TcpClient クラスに関連付けられた関数を処理するクラスを作成しました。サーバーに正常に接続し、データを送受信できます。

問題は、このクラスを使用してクエリ メッセージをサーバーに送信するフォームが複数あることです。サーバーは、呼び出し元のフォームに表示されるデータで応答します。フォーム上のコントロールを更新しようとすると、「クロススレッド操作が無効です: コントロール x は、それが作成されたスレッド以外のスレッドからアクセスされました。」というエラーが表示されます。メイン/UI スレッドのコントロールを更新するために、Control.InvokeRequired を Control.Invoke と共に使用することになっていることはわかっていますが、VB で適切な完全な例を見つけることができません。また、各フォームにさまざまなコントロールを備えた 50 を超えるフォームがあります。各コントロールのデリゲート ハンドラーを作成したくありません。また、スレッドとデリゲートの概念は私にとって非常に新しいものです。過去 1 週間か 2 週間、このテーマについて見つけられるものはすべて読んでいますが、まだ立ち往生しています!

メインスレッドに戻す方法はありますか? そうでない場合、Control.Invoke を 1 回だけ使用して多数のコントロールをカバーする方法はありますか?

データの送受信を開始する前に、接続直後にスレッドを開始しようとしましたが、netStream.BeginRead は、コールバック関数が発火すると、独自のスレッドを開始します。また、BeginRead の代わりに Read を使用してみました。応答に大量のデータがある場合はうまく機能しませんでしたが、BeginRead の方がうまく処理できました。ドロシーがオズで立ち往生しているように感じます。メイン スレッドに戻りたいだけです。

ご協力いただきありがとうございます。

0 投票する
0 に答える
634 参照

c# - C# TcpClient: 送信が予期せず停止する

C# (Unity スクリプト) には、TcpClient を使用してデータを送受信するクライアントがあります。クライアントは、「フレーム」ごとに固定のデータ文字列をサーバーに送信します。サーバーは同じ文字列をエコー バックします。これは、テストとシミュレーションを目的としています。

Async メソッドの BeginWrite と BeginReceive を使用します。データは、以下を使用してクライアントによって送信されます。

そして、次の呼び出しを使用してデータを受信します。

現在、問題は、送信用のメソッドを呼び出すコードがまだ呼び出されているにもかかわらず、短時間 (1 秒程度) 後にクライアントがサーバーへのデータの送信を停止することです (ログ出力と Wireshark で確認)。 . データが送信されないため、サーバーでデータが受信されなくなります。

次のコードは、TcpClient を初期化するために使用されます。

フレームごとに、次のコードを使用して文字列の送信を開始します。

そして、次のメソッドを使用して非同期送信を閉じます。

データを受信するには、次のメソッドをコールバックとして使用します。

私がここで間違っていることを誰か知っていますか?クライアントが送信を停止する理由は何ですか? そのように非同期でデータを送受信できますか?

前もって感謝します!

0 投票する
1 に答える
3146 参照

c# - FileStream.ReadAsync() を使用する場合、非同期モードでファイルを開く必要がありますか?

a の非同期 I/O を実行する古い .Net の方法は、andFileStreamを使用することです。FileStream.BeginRead()FileStream.EndRead()

FileStream.BeginRead()州のMSDNドキュメント:

FileStream には、同期 I/O と非同期 I/O という 2 つの異なる操作モードがあります。どちらを使用してもかまいませんが、基盤となるオペレーティング システムのリソースによっては、これらのモードのいずれかでのみアクセスが許可される場合があります。

デフォルトでは、FileStream はオペレーティング システム ハンドルを同期的に開きます。Windows では、これにより非同期メソッドが遅くなります。非同期メソッドを使用する場合は、FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) コンストラクターを使用します。

.Net 4.5x非同期 I/O を実行する方法は、FileStreamを使用することStream.ReadAsync()です。

FileStream.ReadAsync()のドキュメントに直接リンクするための MSDN ドキュメントStream.ReadAsync()。このドキュメントでは、ファイルを非同期モードで開く必要については言及していません。実際、ドキュメントのサンプル コードは明らかにそうしていません。

したがって、使用時File.ReadAsync()にファイルを非同期モードで開く必要はないと思います。

この仮定は正しいですか?

[編集]

Async for File Access の使用に関する MSDN の記事を見つけました。

これは次のように述べています。

このトピックの例では、オペレーティング システム レベルで非同期 I/O を発生させるオプションを持つ FileStream クラスを使用します。このオプションを使用すると、多くの場合、ThreadPool スレッドのブロックを回避できます。

このオプションを有効にするには、コンストラクター呼び出しで useAsync=true または options=FileOptions.Asynchronous 引数を指定します。

では、ファイルを非同期モードで開くべきだと考えているのですが、そうであれば、 のドキュメントで提供されているサンプル コードがファイルを非同期で開かReadAsync()ないの少し残念です。