動機
C#5.0 async / await構造は素晴らしいですが、残念ながらMicrosoftは.NET4.5とVS2012の両方のリリース候補を示しただけであり、これらのテクノロジがプロジェクトで広く採用されるまでにはしばらく時間がかかります。
Stephen Toubの非同期メソッド、C#イテレーター、およびタスクで、 .NET4.0でうまく使用できる代替品を見つけました。他にも、.NET 2.0でもこのアプローチを使用できるようにする実装が多数ありますが、それらは少し古く、機能が豊富ではないように見えます。
例
これで、私の.NET 4.0コードは次のようになります(コメント付きのセクションは、.NET 4.5でどのように行われるかを示しています)。
//private async Task ProcessMessageAsync()
private IEnumerable<Task> ProcessMessageAsync()
{
//var udpReceiveResult = await udpClient.ReceiveAsync();
var task = Task<UdpAsyncReceiveResult>
.Factory
.FromAsync(udpClient.BeginReceive, udpClient.EndReceive, null);
yield return task;
var udpReceiveResult = task.Result;
//... blah blah blah
if (message is BootstrapRequest)
{
var typedMessage = ((BootstrapRequest)(message));
// !!! .NET 4.0 has no overload for CancellationTokenSource that
// !!! takes timeout parameter :(
var cts
= new CancellationTokenSource(BootstrapResponseTimeout); // Error here
//... blah blah blah
// Say(messageIPEndPoint, responseMessage, cts.Token);
Task.Factory.Iterate(Say(messageIPEndPoint, responseMessage, cts.Token));
}
}
それは仕事をしますが少し醜いように見えます
質問
.NET 4.5でCancellationTokenSourceを使用する場合、タイムアウトパラメーターとしてtimespanを受け取るコンストラクターがあり、その結果、CancellationTokenSource
指定された期間内にキャンセルされます。
.Net 4.0はタイムアウトできないので、.Net 4.0でタイムアウトする正しい方法は何ですか?