質問: this._proxy ?? WebRequest.DefaultWebProxy; if (this.UseDefaultCredentials || this.Credentials != null || webProxy != null && webProxy.Credentials != null) this.SafeCaptureIdenity(state); } //ここでTask.Runつかってるじゃん Task.Run((Action) (() => this._startRequest((object) state))); } catch (Exception ex) { this.HandleAsyncException(state, ex); } ```
回答: こんにちは。 これは根本的に勘違いしている部分があって、「本質的に非同期でない処理を Task として提供するな」というだけの話なんですね。 内部に非同期的な処理が含まれるなら、それを実行するメソッドも非同期になるし、非同期的な処理が含まれないなら、それは同期メソッドになるべきなのです。 その同期メソッドを非同期実行するかどうかはユーザが勝手に選べ、というのがライブラリ API 設計のベストプラクティスだと言う意味です。 「戻り値にTaskを持ったメソッドを作ろうとしています。」というのがそもそも見当違いなのです。戻り値の Task は「そうせざるを得ない」でなるものです。 質問のメソッドを見てみましたが、`Task.Run` で包もうとしているのが同期処理なのであれば、「その同期処理をそのまま提供してください。」 非同期処理なら「非同期メソッドにして、Task.Run は使わないでください。」 TaskCompletionSource は、イベント処理などの非同期スケジュールを実装しなければならない場合に使うものなので、質問のコードの場合ではおそらく不適当です。 もう少し詳細な要件や事情に踏み込んだサンプルがあれば、ピンポイントな話ができると思います。