WebRequest オブジェクトで非同期呼び出しを使用するための次の拡張メソッドがあります。
public static Task<WebResponse> GetReponseAsync(this WebRequest request)
{
return Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
}
public static Task<Stream> GetRequestStreamAsync(this WebRequest request)
{
return Task.Factory.FromAsync<Stream>(request.BeginGetRequestStream, request.EndGetRequestStream, null);
}
これらの拡張メソッドを使用して、次のコードを同等の非同期コードに変換したいと思います。
using (Stream rs = request.GetRequestStream())
{
var postData = Encoding.ASCII.GetBytes(PostData);
rs.Write(postData, 0, postData.Length);
using (WebResponse response = request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
str = reader.ReadToEnd();
rs.Close();
reader.Close();
response.Close();
}
}
これは、WebRequest を使用する別のコードを使用して簡単に実行できましたが、最初に GetRequestStream() を呼び出す必要はありませんでした。
request.GetReponseAsync().ContinueWith(t =>
{
if (t.Exception == null)
{
using (var sr = new StreamReader(t.Result.GetResponseStream()))
{
str = sr.ReadToEnd();
}
}
});
最初のコード ブロックを変換して拡張メソッドを使用し、同等にするにはどうすればよいですか?
EDIT私は.NET 4.0を使用しているため、現在async/awaitはオプションではありません。