2

一般的にストリームからデータを読み取るために、次のメソッドを作成しました。私のコンピューターでは MemoryStream になり、現実の世界ではネットワーク ストリームになります。

    public async void ReadAsync()
    {
        byte[] data = new byte[1024];
        int numBytesRead = await _stream.ReadAsync(data, 0, 1024);

        // Process data ...

        // Read again.
        ReadAsync();
    }

ここでの考え方は、データがコールバックで処理され、コールバックが新しいリーダー スレッドを生成する (そして古いスレッドを強制終了する) というものです。ただし、これは起こりません。StackOverflowException が発生します。

私は何を間違っていますか?

4

3 に答える 3

12

終わりのない再帰があります。

あなたはReadAsync()永久に呼び出しており、メソッドから戻ることはありません(したがって、無限再帰を破っています)。

考えられる解決策は次のとおりです。

public async void ReadAsync()
{
    byte[] data = new byte[1024];
    int numBytesRead = await _stream.ReadAsync(data, 0, 1024);

    // Process data ...

    // Read again.
    if(numBytesRead > 0)
    {
        ReadAsync();
    }
}

再帰をよりよく理解するには、これを確認してください

于 2012-09-04T13:52:05.123 に答える
8

ここに直接関係するスレッドはありません ( async/のイントロを参照してくださいawait)。

あなたStackOverflowExceptionは(通常のように)深すぎる再帰によって引き起こされます。メソッドを反復的に書き直すだけです。

public async Task ReadAsync()
{
  byte[] data = new byte[1024];

  while (true)
  {
    int numBytesRead = await _stream.ReadAsync(data, 0, 1024);
    if (numBytesRead == 0)
      return;

    // Process data ...
  }
}
于 2012-09-04T14:35:58.443 に答える