2012-10-24 7 views
8

विंडोज 8 ऐप के लिए, सी #/एक्सएमएल में मैं पृष्ठभूमि कार्य पंजीकृत करने का प्रयास करता हूं। यह कहना मुश्किल है लेकिन मुझे लगता है कि मेरा पृष्ठभूमि कार्य अच्छी तरह से पंजीकृत है लेकिन जब मैं डीबग स्थान टूलबार पर अपने पृष्ठभूमि कार्य के नाम पर क्लिक करता हूं तो मेरा ऐप किसी भी संदेश के बिना काम करना बंद कर देता है।एक समय ट्रिगर किए गए पृष्ठभूमि कार्य को पंजीकृत नहीं कर सकता

मैंने इवेंट व्यूअर पर लॉग को देखा और मुझे मिलता है: "प्रविष्टि बिंदु MyApp.Pages.SampleBackground टास्क और नाम उदाहरण के साथ पृष्ठभूमि कार्य त्रुटि कोड 0x80010008 के साथ सक्रिय करने में विफल रहा।"

private async void Button_Click_BackgroundTask(object sender, RoutedEventArgs e) 
    { 
     string entryPoint = "MyApp.Pages.SampleBackgroundTask"; 
     string taskName = "Example hourly background task"; 
     TimeTrigger hourlyTrigger = new TimeTrigger(60, false); 

     BackgroundTaskRegistration myBackGroundTaskRegistration = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, null); 
     if(myBackGroundTaskRegistration != null) 
     AttachProgressAndCompletedHandlers(myBackGroundTaskRegistration); 
    } 


    public static BackgroundTaskRegistration RegisterBackgroundTask(String taskEntryPoint, 
                    String name, 
                    IBackgroundTrigger trigger, 
                    IBackgroundCondition condition) 
    { 

     var taskRegistered = false; 
     var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks; 

     foreach (var item in iter) 
     { 
      var task = item.Value; 
      if (task.Name == name) 
      { 
       taskRegistered = true; 
       return item.Value as BackgroundTaskRegistration; 
      } 
     } 


     var builder = new BackgroundTaskBuilder(); 

     builder.Name = name; 
     builder.TaskEntryPoint = taskEntryPoint; 
     builder.SetTrigger(trigger); 

     if (condition != null) 
     { 

      builder.AddCondition(condition); 
     } 

     BackgroundTaskRegistration taskBack = builder.Register(); 

     return taskBack; 
    } 


     private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task) 
    { 
     task.Progress += new BackgroundTaskProgressEventHandler(OnProgress); 
     task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); 
    } 


    private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args) 
    { 
     var progress = "Progress: " + args.Progress + "%"; 

    } 


    private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args) 
    { 
     Debug.WriteLine("Hi"); 
    } 

मैं प्रकट में इस कहा::

 <Extension Category="windows.backgroundTasks" EntryPoint="MyApp.Pages.SampleBackgroundTask"> 
     <BackgroundTasks> 
     <Task Type="timer" /> 
     </BackgroundTasks> 
    </Extension> 

मैं कुछ भूल गए

यहाँ मेरी कोड है?

आपकी मदद के लिए धन्यवाद।

संपादित करें:

 public sealed class SampleBackgroundTask : IBackgroundTask 
{ 
    public void Run(IBackgroundTaskInstance taskInstance) 
    { 
     BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); 

     _deferral.Complete(); 
    } 
} 
+0

ठीक है, स्टार्टर्स के लिए, आपके पास 'asaitc' विधि है, जिसमें 'प्रतीक्षा' है, जो एक कंपाइलर चेतावनी होनी चाहिए। – Servy

+1

MyApp.Pages.SampleBackgroundTask एक ही समाधान में एक अलग प्रोजेक्ट में है? – Akinwale

+0

नहीं, यह कार्य मेरे प्रोजेक्ट पेज में से किसी एक के भीतर एक अलग वर्ग में है। क्या यह एक अलग परियोजना पर होना चाहिए? मैंने कार्य के कोड को जोड़ने के लिए अपना प्रश्न संपादित किया। –

उत्तर

6

मैं भी इस समस्या थी: यहाँ मेरी टास्क का कोड, अपने प्रोजेक्ट पेज में से एक के भीतर है। मेरे पास भी एक ही परियोजना में मेरा था। अंततः मुझे कार्य को एक अलग परियोजना में ले जाकर काम करने के लिए मिला। मुझे प्रोजेक्ट आउटपुट को विंडोज रनटाइम घटक (गुणों के आवेदक टैब के तहत) के रूप में सेट करना पड़ा। एक संदर्भ के रूप में परियोजना को जोड़ने के लिए भी मत भूलना।

+0

धन्यवाद! यह जानकारी कमाल है! –

3

आपको पृष्ठभूमि टास्क चलाने से पहले उपयोगकर्ता की अनुमति की आवश्यकता है, आप या तो मैन्युअल रूप से ऐसा कर सकते हैं: ऐप खोलकर और सेटिंग आकर्षण में अनुमतियां क्लिक करके और लॉक स्क्रीन सेटिंग चालू करना।

जब पहली स्क्रीन इस से भरा हुआ है आप भी उपयोगकर्ता का संकेत दे सकता:

BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync(); 

जरूरत नहीं बाद एक बहुत बेहतर उपयोगकर्ता अनुभव करने के लिए नेतृत्व करने के लिए जा रहा है कहने के लिए।

2

संदर्भ और पुनर्निर्माण पर अपनी पृष्ठभूमि कार्य परियोजना मुख्य परियोजना में जोड़ें। यह

3

दो साल बाद, अब विंडोज 10 में विजुअल स्टूडियो, विजुअल स्टूडियो 2015. फिर से, वही समस्या।

पूछने वाले ने संकेत दिया है कि उनका पृष्ठभूमि कार्य उसी प्रोजेक्ट में रह रहा था। यह काम नहीं करेगा: पृष्ठभूमि कार्यों पर एक बहुत ही संपूर्ण लेख here है। साथ ही, जैसा कि टिम ने नोट किया था, BackgroundExecutionManager.RequestAccessAsync() को पहले कॉल करना होगा। 8.1 से, हालांकि, जब इसे छोड़ा जाता है, the background task registration will fail in that case, तो आप उस स्थान पर कभी नहीं पहुंच पाएंगे जहां कार्य ट्रिगर विफल रहता है।

आवश्यकताओं सारांश में:

  • 'का इंतजार है BackgroundExecutionManager।RequestAccessAsync() 'पहले
  • टास्क वर्ग एक Windows रनटाइम घटक परियोजना
  • विंडोज रनटाइम घटक परियोजना बुला एप्लिकेशन
  • काम वर्ग के रूप में ऊपर ऐप की मेनिफेस्ट में घोषित किया जाना चाहिए में संदर्भित किया जाना चाहिए में होना चाहिए, साथ पूर्ण नामस्थान नाम
  • विंडोज रनटाइम घटक प्रोजेक्ट और ऐप जो इसका उपयोग करता है उसे उसी विंडोज संस्करण को लक्षित करना होगा। विजुअल स्टूडियो में समाधान एक्सप्लोरर -> प्रोजेक्ट पर राइट-क्लिक करें -> गुण -> एप्लिकेशन resp। लाइब्रेरी टैब -> लक्ष्यीकरण -> लक्ष्य और लक्ष्य संस्करण।

मेरे उदाहरण में, मैंने निश्चित रूप से इन सभी को किया था, फिर भी कार्य ट्रिगर नहीं किया जाएगा। डीबग ट्रेस ने दिखाया कि "प्रोग्राम" [0x72C] backgroundTaskHost.exe 'कोड 1 से बाहर निकला है ", डीबगर एक निष्पादन EngineException पर तोड़ दिया, और लक्ष्य मशीन का ईवेंट लॉग (अनुप्रयोग और सेवाएं लॉग -> माइक्रोसॉफ्ट -> विंडोज़ -> BackgroundTaskInfrastructure -> परिचालन) सभी प्रकार की रचनात्मक पूरी तरह से अनियंत्रित विंडोज़ त्रुटि कोड सूचीबद्ध:

"प्रविष्टि बिंदु और नाम के साथ पृष्ठभूमि कार्य त्रुटि कोड 0x8007001F (resp। 0x800706BE/0x80131509) के साथ सक्रिय करने में विफल रहा।"

असफलता अनिश्चित थी: सबसे पहले, वे केवल ही कभी ही घटित हुए, और कई सफल कार्यक्रमों में भी बदतर हो गए, जब तक कि पृष्ठभूमि कार्य को और कभी नहीं बुलाया जाता।

जब पृष्ठभूमि कार्यों का नामस्थान नाम बदल दिया गया था (सभी कार्य पंजीकरण, पैकेज प्रकट, और कोड में), इसने पहली बार त्रुटि तय की, और फिर समय के साथ भी बदतर हो गया।

इस मामले में विशेष परिस्थिति यह थी कि ऐप को दूरस्थ लक्ष्य मशीन पर विकसित किया गया था और रिमोट डीबगर के साथ डीबग किया गया था। प्रत्येक डीबगर रन से पहले ऐप पैकेज को हटाकर त्रुटियों से छुटकारा पा लिया।

तो, पृष्ठभूमि कार्य चलाते समय इन त्रुटियों (0x8007001F/0x800706BE/0x80131509) को पंजीकृत कार्य को सही तरीके से नहीं ढूंढना पड़ता है। यह सुनिश्चित करने में सहायता कर सकता है कि कार्य सही तरीके से अपंजीकृत है, और एक नया संशोधन चलाने से पहले ऐप पैकेज को निकालने के लिए। पावरहेल कमांड:

Get-AppPackage | where name -eq <myAppPackageGuid> | Remove-AppPackage 

किसी को भी एक ही समस्या होने पर बस इसे यहां दस्तावेज़ित करना।

+0

मेरे लिए कुंजी यह थी कि एप्लिकेशन * और * WinRT घटक को उसी विंडोज रिलीज़ को लक्षित करना था। मेरे मामले में पृष्ठभूमि कार्य के साथ मेरा विनआरटी घटक वर्षगांठ अपडेट को लक्षित कर रहा था और मेरा ऐप निर्माता के अपडेट को लक्षित कर रहा था। एक बार वे गठबंधन हो जाने के बाद, पृष्ठभूमि कार्य उचित तरीके से निष्पादित किया गया। –

0

पृष्ठभूमि कार्यों को लिखते समय मेरे पास समस्या यह थी कि सेटिंग्स के तहत विंडोज 10 में-> गोपनीयता-> पृष्ठभूमि ऐप्स, मुझे पृष्ठभूमि में ऐप्स को चलाने की अनुमति देने का विकल्प सक्षम करना था। उम्मीद है कि यह किसी की मदद करता है!

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

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