2012-09-28 14 views
92

Thread.Sleep विंडोज स्टोर ऐप्स के लिए .NET में समर्थित नहीं प्रतीत होता है।थ्रेड। विंडोज स्टोर के लिए .NET में नींद प्रतिस्थापन

उदाहरण के लिए, जब किसी भी .NET फ्रेमवर्क (2.0, 3.5, 4.0, 4.5) को लक्षित इस

  System.Threading.Thread.Sleep(1000); 

संकलन होगा, लेकिन नहीं जब विंडोज स्टोर ऐप्लिकेशन के लिए .NET लक्ष्यीकरण (या एक पोर्टेबल वर्ग पुस्तकालय में जो 4.5 और स्टोर दोनों को लक्षित करता है)।

सिस्टम। थ्रेडिंग। अभी भी वहां है, इसमें स्लीप विधि नहीं है।

मुझे अपने ऐप में कुछ सेकंड के लिए कुछ देरी करने की ज़रूरत है, क्या कोई उपयुक्त प्रतिस्थापन है?

संपादित करें कि देरी की आवश्यकता क्यों है: मेरा ऐप एक गेम है और देरी यह है कि कंप्यूटर प्रतिद्वंद्वी की तरह दिखने के लिए उसके अगले कदम के बारे में "सोच" है। विधि को पहले से ही असंकालिक रूप से कहा जाता है (मुख्य धागा अवरुद्ध नहीं है), मैं सिर्फ प्रतिक्रिया समय को धीमा करना चाहता हूं।

+2

विंडोज स्टोर ऐप्स को ध्यान में रखते हुए यूआई को फ्रीज करने में सक्षम नहीं होना चाहिए (सबकुछ एसिंक होना चाहिए) यह समझ में आता है कि यह समर्थित नहीं है। – Sruly

+2

क्या आपके पास ईवेंट या 'मॉनिटर' कक्षा है? आप नींद अनुकरण करने के लिए टाइमआउट के साथ 'प्रतीक्षा' विधि का उपयोग कर सकते हैं। – Tudor

+0

यह Apptivate.ms के लिए है? : 3 – EaterOfCode

उत्तर

188

विंडोज स्टोर ऐप्स एसिंक्रोनि को गले लगाते हैं - और "एसिंक्रोनस पॉज़" द्वारा प्रदान किया जाता है। तो एक एसिंक्रोनस विधि के भीतर, आप लिखेंगे:

await Task.Delay(TimeSpan.FromSeconds(30)); 

... या जो भी देरी आप चाहते हैं। एसिंक्रोनस विधि 30 सेकंड बाद जारी रहेगी, लेकिन थ्रेड अवरुद्ध हो जाएगा, जैसा कि सभी await अभिव्यक्तियों के लिए अवरुद्ध किया जाएगा।

+0

यह विंडोज स्टोर के लिए .NET के लिए काम करता है, इसलिए आपने मेरे प्रश्न का उत्तर दिया। धन्यवाद! – Max

+1

दुर्भाग्यवश, टास्क। पोर्टेबल क्लास लाइब्रेरी में .NET 4.5 + store + WP7 को लक्षित करते समय डेले समर्थित नहीं है .. मुझे लगता है कि मैं इसे प्लेटफ़ॉर्म विशिष्ट कक्षाओं में ले जाऊंगा। – Max

+1

@ मैक्स: नहीं, क्योंकि यह .NET 4.5 से पहले मौजूद नहीं था। आईआईआरसी, डब्ल्यूपी 7 में कोई टीपीएल समर्थन नहीं है। (मैं गलत हो सकता था ...) –

-7

Thread.Sleep() का उपयोग करने के लिए लगभग कोई कारण नहीं है (परीक्षण उद्देश्यों को छोड़कर)।

आईएफ (और केवल अगर) आपके पास सोने के लिए धागा भेजने का बहुत अच्छा कारण है, तो आप Task.Delay() की जांच कर सकते हैं, जिसे आप निर्दिष्ट समय के लिए "प्रतीक्षा" करने का इंतजार कर सकते हैं। हालांकि यह कभी भी अच्छा विचार नहीं है कि थ्रेड बैठे और कुछ भी न करें। खराब अभ्यास ...

+9

मैं असहमत हूं। यदि धागा पृष्ठभूमि धागा है और नींद कम है तो टाइमर का उपयोग करने से कुछ मिलीसेकंड के लिए सोना अधिक कुशल है। –

+1

और कभी-कभी आपको परिणामों के अधिकार आंकड़े के सलाह देने के बावजूद ऐसा करने के लिए कहा जाता है;) – Jordan

11

MainPage.xaml.cs

public MainPage() 
{ 
    this.InitializeComponent(); 
    this.WaitForFiveSeconds(); 
} 

private async void WaitForFiveSeconds() 
{ 
    await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5)); 
    // do something after 5 seconds! 
} 
+0

MainPage.xaml.cs –

+1

@ ज़ीएक्सज़: बस इसे संपादित करें! :) – Ashe

18

मैं सिर्फ एक ही समस्या थी और एक अन्य दिलचस्प समाधान है कि मैं आपके साथ साझा करना चाहता था मिल गया। मैं ("स्लिम" संकेत के लिए धन्यवाद @Brannon) इस तरह यह करना होगा तुम सच में धागा अवरोधित करना चाहते हैं:

// `waitHandle.Set` is never called, so we wait always until the timeout occurs 
using (var waitHandle = new ManualResetEventSlim(initialState: false)) 
{ 
    waitHandle.Wait(TimeSpan.FromSeconds(5)); 
} 
+0

पोर्टेबल कोडिंग के लिए यह सबसे अच्छा जवाब है। – zezba9000

+0

यह मेरे लिए बेहतर काम करता है। –

+0

इसका "पतला" संस्करण का उपयोग करें। – Brannon

41

नफरत राज्य के लिए स्पष्ट लेकिन मामला किसी में एक पंक्ति चाहता था System.Threading.Tasks.Task.Delay(3000).Wait()

संबंधित मुद्दे