必要なのは、非同期操作を順番に実行するクラスです。
class FooSocket
{
private Socket _Socket;
// Message is a class that wraps a byte array.
public Task<Message> Receive() { /*Bla...*/ };
public Task<int> Send(Message message) { /*Bla...*/ };
}
送信、受信、送信をこの順序で呼び出す場合、最初に送信し、最初の受信が終了するまで残りの受信および送信操作をキューに入れる必要があります。
クラスでメインタスクフィールドを作成して、MainTask = MainTask.ContinueWith(...)
ある種のアプローチに従ってみました。私はこれを正確に実行するSequencerというクラスを作成しましたが、継続などでネストされたタスクを作成して(Task.Factory.FromAsyncメソッドを使用して)、どういうわけか間違っていると感じました。
また、TaskCompletionSourceオブジェクトをキューに入れ、Receive / Sendメソッドでそれらのタスクを返し、別のスレッドで無限ループでキューをチェックするようなものを作成しようとしましたが、約200kのFooSocketインスタンスがあるため、それぞれのスレッドも感じました賢明ではありません。スレッドプールにすると、「スレッドプールは長時間の操作には使用しないでください」というルールになります。
私は親密に感じますが、これらの仕事を注文するための最も効率的な方法が何であるかを確信できません。