यह ऐसा कुछ है जिसे मैंने हमेशा थ्रेड/पृष्ठभूमिवर्कर का उपयोग किया है, लेकिन चीजों को करने के कार्य तरीके पर माइग्रेट करने का प्रयास कर रहा हूं।कार्य का उपयोग करके निरंतर मतदान
मान लें कि मेरे पास एक तृतीय पक्ष एसडीके है जिसका उपयोग मैं यूएसबी पोर्ट से बाइट पढ़ने के लिए करता हूं। उस पढ़ा गया कॉल अवरुद्ध हो रहा है और 100 एमएस के बाद समय समाप्त हो जाता है यदि कोई बाइट पढ़ा नहीं जाता है, तो शून्य वापस आ जाता है। अगर बाइट पढ़े जाते हैं, तो यह तुरंत लौटता है, बाइट [] सरणी को बाइट्स को वापस लौटाता है।
इसलिए मुझे मूल रूप से मतदान जारी रखने की आवश्यकता है, और पार्सिंग फ़ंक्शन को कॉल करके प्राप्त बाइट्स पर कार्रवाई करें। यह एक डब्ल्यूपीएफ एप्लीकेशन है, इसलिए लौटा बाइट्स को यूआई थ्रेड फ़ंक्शन में पास करने में सक्षम होना चाहिए।
ऐसा करने का सही तरीका क्या है?
private void _connectUsbButton_Click(object sender, RoutedEventArgs e)
{
ListenForUsbMessagesAsync();
}
private async void ListenForUsbMessagesAsync()
{
while (true)
{
byte[] readBytes = await ReadBytesAsync();
Parse(readBytes);
}
}
private Task<byte[]> ReadBytesAsync()
{
Task<byte[]> readBytesTask = Task.Run(() =>
{
byte[] bytes;
do
{
bytes = ReadBytes();
} while (bytes == null);
return bytes;
});
return readBytesTask;
}
private byte[] ReadBytes()
{
byte[] readBytes = _usbSdk.ReadBytes(); //100ms timeout (returns null if no bytes read)
return readBytes;
}
'टास्क' एक अंतिम परिणाम के लिए है, न कि एक समय-समय पर होता है कि। –
@ डैनियलए। यही कारण है कि मैं इसे थोड़ी देर (सत्य) लूप में बुलाता रहता हूं। अंतिम परिणाम कुछ बाइट पढ़ा जा रहा है। बाइट हर समय नहीं पढ़े जाते हैं, असल में ज्यादातर समय कोई बाइट पढ़ा नहीं जाता है। – Eternal21
आपको इस तरह के कार्य के लिए 'थ्रेड' क्यों पसंद नहीं आया? 'कार्य को जल्दी खत्म करने के लिए डिज़ाइन किया गया है, जबकि आपके आईओ में मिनट लग सकते हैं – slawekwin