2016-08-24 7 views
5

मैं फ़ोन के लिए डिज़ाइन किए गए यूडब्ल्यूपी ऐप पर काम कर रहा हूं। यह आपके स्थानीय होम नेटवर्क पर चल रहे सर्वर के साथ डेटा सिंक करने के लिए डिज़ाइन किया गया है। इस समन्वयन में कुछ समय लग सकता है ताकि डेटा को सिंक करने के लिए पृष्ठभूमि कार्य सबसे अच्छी जगह न हो; यह शायद आवंटित 30 सेकंड से अधिक ले जाएगा। विचार, हालांकि, एक टाइमर ट्रिगर के साथ एक पृष्ठभूमि कार्य का उपयोग करना है; यह जांचने के लिए सर्वर को कॉल करेगा कि उपभोग करने के लिए कोई अपडेट हैं या फिर टोस्ट अधिसूचना पॉप अप करें कि क्या यह सिंक्रनाइज़ेशन करने के लिए अग्रभूमि में चलाया जा सकता है या नहीं।यूडब्ल्यूपी पृष्ठभूमि कार्य HttpClient विफल रहता है जब डिवाइस स्क्रीन बंद होती है

कोड बहुत अच्छा काम करता है ... यदि स्क्रीन चालू है। लेकिन अगर स्क्रीन बंद है, तो मुझे कभी भी कोई सूचना नहीं मिलती है। सबसे पहले मैंने सोचा कि timertrigger ट्रिगर नहीं कर रहा था, लेकिन जब भी यह दौड़ गया और मैंने निश्चित रूप से लॉग इन किया, तो मैं हर 15 मिनट में दौड़ गया। मैं इसमें गहराई से देखा, और यह असफल रहा है। विशेष रूप से, यह नेटवर्क कॉल पर असफल रहा है; निम्नलिखित त्रुटि के साथ HttpClient.GetAsync:

"The text associated with this error code could not be found.\r\n\r\nA connection with the server could not be established\r\n" 

अब मैंने सर्वर की जांच की है; यह काम कर रहा है। मैं स्क्रीन चालू करता हूं और कोड अचानक फिर से काम करता है। मैं केवल चलाने के लिए ट्रिगर सेट अप किया है जब एक बिना मीटर कनेक्शन उपलब्ध है:

var status = await BackgroundExecutionManager.RequestAccessAsync(); 
    if(status.In(BackgroundAccessStatus.DeniedBySystemPolicy, BackgroundAccessStatus.DeniedByUser)) 
    { 
     return; 
    } 

    var builder = new BackgroundTaskBuilder(); 
    builder.Name = Constants.BackgroundTaskName; 
    builder.SetTrigger(new TimeTrigger(15, false)); 
    builder.AddCondition(new SystemCondition(SystemConditionType.FreeNetworkAvailable)); 
    BackgroundTaskRegistration task = builder.Register(); 

तो मैं लगता होगा कि टाइमर केवल ट्रिगर किया जाता है जब वाईफ़ाई उपलब्ध है। लेकिन तब जब मैं वास्तव में प्रदर्शन HTTP इस कोड का उपयोग करें:

async protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args) 
    { 
     if (BackgroundWorkCost.CurrentBackgroundWorkCost == BackgroundWorkCostValue.High) 
      return; 
     if (!NetworkInterface.GetIsNetworkAvailable()) 
      return; 
     base.OnBackgroundActivated(args); 
     if (args.TaskInstance.Task.Name == Constants.BackgroundTaskName) 
     { 
      var cancel = new CancellationTokenSource(); 
      args.TaskInstance.Canceled += (s, e) => 
      { 
       cancel.Cancel(); 
       cancel.Dispose(); 
      }; 
      var deferral = args.TaskInstance.GetDeferral(); 
      try 
      { 
       HttpClient client = GetClient(); 
       var response = await client.GetAsync(ConstructUrl(client.BaseAddress, "updates"), cancel.Token); 
       var info = await ParseHttpResponse<UpdateInformation>(response);  
      } 
      catch { } 
      finally 
      { 
       deferral.Complete(); 
      } 
     } 

अब अजीब बात यह है कि NetworkInterface.GetIsNetworkAvailable() देता है "सही", वहाँ एक नेटवर्क उपलब्ध है मुझे बता। लेकिन फिर भी, जब मैं कॉल करता हूं, तो मुझे "सर्वर के साथ एक कनेक्शन स्थापित नहीं किया जा सका"। मुझे नहीं पता कि मैं यहाँ क्या गलत कर रहा हूं।

कोई विचार?

+0

मुझे लगता है कि अपने मामले के लिए सही तरीके से [ControlChannelTrigger] उपयोग करने के लिए है (https://msdn.microsoft.com/library/windows/apps/hh701032), आपके पास कोशिश की? एक [नमूना] भी है (https://code.msdn.microsoft.com/windowsapps/ControlChannelTrigger-HTTP-9d7a6b3d)। –

+0

@ रॉन पेंटन: मैं भी इस समस्या में भाग रहा हूं। क्या आपको इस समस्या का कोई समाधान मिला? – c2tarun

+0

नहीं मैं कभी नहीं कर सकता था। मुझे लगता है कि यह सिस्टम में बनाया गया है। मैंने कई अलग-अलग फोनों की कोशिश की। मैंने वास्तव में पिछले सप्ताह छोड़ दिया था। अंत में एंड्रॉइड की कोशिश कर रहा है। आह। एक युग का अंत। –

उत्तर

2

यह बहुत संभावना है कि नेटवर्क को कनेक्टेड स्टैंडबाय के दौरान कार्यात्मक होने के लिए आपके पृष्ठभूमि कार्य पंजीकरण पर "IsNetworkRequested" निर्दिष्ट करना आवश्यक है (जो स्क्रीन बंद होने पर होता है)।

प्रलेखन यहाँ देखें: https://docs.microsoft.com/en-us/uwp/api/Windows.ApplicationModel.Background.BackgroundTaskBuilder

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