これはSocket
からデータを読み取る良い方法ですか?ソケット受信データの非同期/待機待ち
public class StateObject : IDisposable
{
private const int _bufferSize = 1024;
public byte[] Buffer { get; } = new byte[_bufferSize];
public int BufferSize { get; } = _bufferSize;
public MemoryStream MsStream { get; }
public EnhStateObject()
{
MsStream = new MemoryStream();
}
public void Dispose()
{
MsStream.Dispose();
}
}
public async static Task<int> ReceiveAsync(this Socket client, StateObject state)
{
var task = await await Task<int>.Factory.FromAsync(
(cb, s) => client.BeginReceive(state.Buffer, 0, state.BufferSize, SocketFlags.None, cb, s),
client.EndReceive, null).ContinueWith(t =>
{
state.MsStream.Write(state.Buffer, 0, t.Result);
return t;
});
if (task == state.BufferSize) await client.ReceiveAsync(state);
return task;
}
つまり、オブジェクトの外部に転送し、受信した情報を再帰呼び出しによって格納します。
同じFromAsync
ラッパーを使用してこれを行うよりエレガントな方法がありますか?
これが機能する場合は、SOよりもCode Reviewに適している可能性があります。どちらの方法でも詳細を追加する必要があるかもしれません(例えば 'StateObject'の定義が役に立ちそうです)。 'await await'は疑わしく見える。 –
投稿を更新しました。 'StateObject'について何も特別なことはありません。 '[await await' [here](https://blogs.msdn.microsoft.com/pfxteam/2011/10/24/task-run-vs-task-factory-startnew/) –
に同意すると簡単にできます:削除'Task .Factory.FromAsync'と' ContinueWith'' t.Result'から返ります。 –