動機
C#5.0の非同期/待つ構築物は、素晴らしいです、残念ながらまだマイクロソフトが唯一の.NET 4.5とVS 2012の両方のリリース候補を示し、そしてそれこれらの技術が我々のプロジェクトに広く採用されるまでには時間がかかるだろう。貧しいマンの非同期/を使用して非同期タイムアウトを実装する構造を待つ
私はきれいに.NET 4.0で使用可能な代替を見つけたスティーブンToubの Asynchronous methods, C# iterators, and Tasksで。 .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ではこれを行う正しい方法は何ですか?
関連の質問:http://stackoverflow.com/questions/9110472/using-async-await-on- net-4 – CodesInChaos
タイトルがタイムアウトし、タイマー(一部の期間の実行で定期的に使用される)が誤解を招き混乱していたため、タイトルの「タイマー」を「タイムアウト」に変更しました –