प्रेरणा
सी # 5.0 async/इंतजार निर्माणों भयानक, दुर्भाग्य से अभी तक माइक्रोसॉफ्ट केवल दोनों .NET 4.5 और वी.एस. 2012, और इसके बारे में एक रिलीज उम्मीदवार दिखाए जाते हैं कुछ समय लगेगा जब तक कि इन प्रौद्योगिकियों में इन प्रौद्योगिकियों को व्यापक रूप से अपनाया नहीं जाएगा।async टाइमआउट को लागू गरीब मनुष्य async का उपयोग कर/नेट में निर्माणों का इंतजार 4.0
स्टीफन टब के Asynchronous methods, C# iterators, and Tasks में मुझे एक प्रतिस्थापन मिला है जिसे .NET 4.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 का उपयोग कर एक निर्माता है कि एक समय समाप्ति पैरामीटर के रूप में समयावधि लेता है, ताकिजिसके परिणामस्वरूप वहाँ हैनिर्दिष्ट अवधि के भीतर रद्द हो जाता है।
नेट 4.0 टाइमआउट करने में सक्षम नहीं है, तो .NET 4.0 में ऐसा करने का सही तरीका क्या है?
संबंधित प्रश्न: http://stackoverflow.com/questions/9110472/using-async-await-on-
यह जब मैं F12 दबाएँ
CancelAfter()
के कार्यान्वयन को देखने के लिए refereance souce कोड है नेट -4 – CodesInChaosशीर्षक में "टाइमर" को "टाइमआउट" में बदल दिया गया है क्योंकि सवाल टाइमआउट और "टाइमर" (कुछ अवधि के निष्पादन के साथ आवर्ती के लिए उपयोग किया जाता है) के बारे में है, भ्रामक और विचलित –