विंडोज स्टोर के लिए .NET में स्लीप स्लीप रिप्लेसमेंट


98

Windows Store ऐप्स के लिए .NET.Sleep .NET में समर्थित नहीं लगती है।

उदाहरण के लिए, यह

System.Threading.Thread.Sleep(1000);

किसी भी .NET फ्रेमवर्क (2.0, 3.5, 4.0, 4.5) को लक्षित करते समय संकलित करेंगे, लेकिन विंडोज़ स्टोर ऐप (या 4.5 और स्टोर दोनों को लक्षित करने वाले पोर्टेबल क्लास लाइब्रेरी में) के लिए .NET को लक्षित करते समय नहीं।

System.Thread.Thread अभी भी वहाँ है, यह सिर्फ स्लीप विधि नहीं है।

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

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


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

2
क्या आपके पास इवेंट्स या Monitorक्लास है? Waitनींद का अनुकरण करने के लिए आप टाइमआउट के साथ विधि का उपयोग कर सकते हैं ।
ट्यूडर

क्या यह Apptivate.ms के लिए है? : 3
EaterOfCode 13

3
Thread.Sleepख़राब तकनीक के कूड़ेदान में भटकने के लिए याय ।
खर्च करें

जवाबों:


203

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

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

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


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

1
@ मोम: नहीं, क्योंकि यह .NET 4.5 से पहले मौजूद नहीं था। IIRC, WP7 में ही कोई TPL समर्थन नहीं है। (मैं गलत हो सकता है ...)
जॉन स्कीट

4
.RunSynchronously()जरूरत पड़ने पर आप निपट सकते हैं ।
HappyNomad

1
@ राम: अच्छी तरह Thread.Sleep से .NET 3.5 में समर्थित है, इसलिए यह प्रश्न लागू नहीं होता है। इसमें कोई संदेह नहीं है कि आपके पास एक सवाल है, लेकिन यह ऐसा नहीं है जैसा कि यह एक जैसा है। कृपया पढ़ें smallurl.com/stack-hints फिर एक नया सवाल पूछें।
जॉन स्कीट

2
@ राम: मुझे यकीन नहीं है कि मैं आपकी टिप्पणियों से अनुमान लगाने के लिए कैसे था। WPF और एनीमेशन के बारे में SO पर पहले से ही समान प्रश्न हैं।
जॉन स्कीट

46

स्पष्ट बताने के लिए नफरत है, लेकिन मामले में कोई भी एक लाइन चाहता था System.Threading.Tasks.Task.Delay(3000).Wait()


20

मुझे बस एक ही समस्या थी और एक और दिलचस्प समाधान मिला जिसे मैं आपके साथ साझा करना चाहता था। यदि आप वास्तव में धागे को अवरुद्ध करना चाहते हैं, तो मैं इसे इस तरह से करूंगा (धन्यवाद "स्लिम" संकेत के लिए @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));
}

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

इस के "स्लिम" संस्करण का उपयोग करें।
ब्रानोन

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!
}

-7

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

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


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

1
और कभी-कभी आपको परिणामों के अधिकार के बारे में सलाह देने के बावजूद ऐसा करने के लिए कहा जाता है;)
जॉर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.