2013-10-29 11 views
15

रिपोर्ट करने के लिए, यहIProgress <T> कितनी बार प्रगति

  • कोड एक आवृत्ति है कि "उचित" है करने के लिए अपनी प्रगति रिपोर्ट को सीमित करने के रिपोर्टिंग प्रगति की जिम्मेदारी होनी चाहिए, -या-
  • IProgress<T> के विशिष्ट कार्यान्वयन की ज़िम्मेदारी यह जानकर कि प्रगति की रिपोर्टिंग उच्च आवृत्ति पर हो सकती है, जिस तरह से यह प्रगति पेश करेगा।

प्रश्न का संदर्भ है कि मेरे पास कुछ कोड है जो प्रगति की रिपोर्ट करने के लिए IProgress<T> का उपयोग करता है, और यह बहुत उच्च दर पर प्रगति की रिपोर्ट करता है। मैं यूआई प्रगति पट्टी के साथ प्रगति प्रदर्शित करना चाहता हूं। यदि मैं प्रदत्त Progress<T> कार्यान्वयन (जो पोस्ट यूआई सिंक्रनाइज़ेशन कॉन्टेक्स्ट में प्रगति करता है) का उपयोग करता है, तो यह यूआई को उत्तरदायी नहीं होने का कारण बनता है (यानी संदेश कतार में भेजे गए बहुत से संदेश हैं, कि उपयोगकर्ता "रद्द करें" पर भी क्लिक नहीं कर सकता संवाद पर बटन)।

तो,

  • मैं कम रिपोर्टिंग करके इसे ठीक कर सकता है, लेकिन क्या हुआ अगर मैं एक IProgress<T> कार्यान्वयन कि सिर्फ प्रगति लिखा एक लॉग फ़ाइल के लिए (और उच्च आवृत्ति रिपोर्टिंग संभाल सकता) था। -या-
  • मैं अपना खुद का विशिष्ट IProgress<T> कार्यान्वयन बनाकर इसे ठीक कर सकता हूं जो सीमित है कि मैंने कितनी बार प्रक्रिया को संसाधित/रिपोर्ट किया था। संभवतः, यह कार्यान्वयन गैर-यूआई थ्रेड पर नवीनतम प्रगति रिकॉर्ड करेगा, और फिर (शायद) यूआई टाइमर के आधार पर अपडेट किया जाएगा।
+0

दिलचस्प सवाल, लेकिन शायद ऑफ-विषय? मेरा व्यक्तिगत दृष्टिकोण: उत्पादक जो कुछ देता है, उसे सर्वोत्तम बनाने के लिए उपभोक्ता पर निर्भर करता है। तो आउटपुट +1 की कोई सीमा नहीं है। संपादित करें: ठीक है, अगर निर्माता प्रदर्शन कारणों से खुद को सीमित करता है, तो यह एक अच्छा कारण हो सकता है। – igrimpe

+0

एक प्रगति पट्टी आमतौर पर एक पूर्णांक मान 0..100 लेता है। यदि आप अपडेट हैं तो अगले पूर्णांक पर नहीं जाते हैं तो यूआई को इसकी रिपोर्ट करने का कोई कारण नहीं है। लेकिन मुझे दिलचस्पी है कि विशेषज्ञ क्या कहते हैं – Harrison

+1

@ हैरिसन, मैं कहूंगा कि प्रगति आम तौर पर इस तरह से रिपोर्ट की जाती है जो प्रगति की रिपोर्ट करने वाले कोड को समझ में आता है। प्रगति का उपभोक्ता यह बदलने के लिए ज़िम्मेदार है कि वे इसे कैसे पेश करना चाहते हैं (उदाहरण के लिए एक प्रतिशत पूर्ण)। –

उत्तर

11

एक सजावट लिखें जो कॉल को थ्रॉटल करता है। इस तरह आप थ्रॉटलिंग और वास्तविक रिपोर्टिंग के तर्क को अलग करते हैं, और आप इसे किसी अन्य IProgress<T> कार्यान्वयन के लिए उपयोग कर सकते हैं।

जब आप प्रगति रिपोर्टिंग को थ्रॉटल करना चाहते हैं तो इस सजावट का उपयोग करें। नीचे दिए गए वर्ग के उदाहरण के साथ अपने प्रगति रिपोर्टर को सरल लपेटें।

मैंने आपके लिए थ्रॉटलिंग तर्क छोड़ा है। आप इसे समय-आधारित, राशि-कॉल-आधारित या कुछ अन्य मानदंड बना सकते हैं।

public class ProgressThrottler<in T>: IProgress<T> { 
    public ProgressThrottler(IProgress<T> progress) { 
     if (progress == null) 
      throw new ArgumentNullException("progress"); 

     _progress = progress; 
    } 

    private readonly IProgress<T> _progress; 

    public void Report(T value) { 
     // Throttles the amount of calls 
     bool reportProgressAfterThrottling = ...; 

     if (reportProgressAfterThrottling) { 
      _progress.Report(value); 
     } 
    } 
} 
+0

विचार सही है, लेकिन कार्यान्वयन में मामूली त्रुटि है। रिपोर्ट शून्य वापस आती है। इसके अलावा, मुझे इंटरफ़ेस को स्पष्ट रूप से कार्यान्वित करने का बिंदु नहीं दिखाई देता है, कम से कम अच्छा आईएमएचओ के रूप में नौकरी करता है। –

+0

मैं अभी भी संपादन कर रहा था, लेकिन सुझावों के लिए thanx। – Maarten

+1

@ KrisVandermotten स्पष्ट रूप से लागू करने के लिए DI उपयोगकर्ताओं के बीच आकस्मिक युग्मन को सीधे कार्यान्वयन को हतोत्साहित करने के लिए काफी आम है। –

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