2015-08-31 13 views
6

जब मैं System.Threading.Timer का उपयोग मैं अपने टाइमर बंद करो और इसे फिर से शुरू कर सकते हैं:मैं डिवाइस से कैसे रद्द कर सकता हूं। स्टार्ट टाइमर?

protected override void OnScrollChanged(int l, int t, int oldl, int oldt) 
{ 
    if (timer == null) 
    { 
     System.Threading.TimerCallback tcb = OnScrollFinished; 
     timer = new System.Threading.Timer(tcb, null, 700, System.Threading.Timeout.Infinite); 
    } 
    else 
    { 
     timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); 
     timer.Change(700, System.Threading.Timeout.Infinite); 
    } 
} 

सबसे अच्छा Device.StartTimer बंद करो और इसे फिर से शुरू करने के लिए तरीका क्या है?

+0

[इस लिंक का प्रयास करें] (http://solvedstack.com/questions/c-timer-or-thread-sleep) –

+0

आप का उपयोग करें या Thread.Sleep या आप निर्माता में सेट कर सकते हैं कर सकते हैं अवधि पैरामीटर। –

+0

नहीं, मैं सो नहीं सकता। एप्लिकेशन को – Kirill

उत्तर

7

मुझे लगता है कि आप डिवाइस का जिक्र कर रहे हैं। XamarinForms में स्टार्टटाइम। बंद करो या फिर लगातार काम जारी रखने के लिए जिस तरह से क्या दूसरा तर्क रिटर्न से निर्धारित होता है:

// run task in 2 minutes 
Device.StartTimer(TimeSpan.FromMinutes(2),() => 
{ 
    if (needsToRecur) 
    { 
     // returning true will fire task again in 2 minutes. 
     return true; 
    } 

    // No longer need to recur. Stops firing task 
    return false; 
}); 

आप अस्थायी रूप से इस घड़ी को रोकने, और फिर कुछ समय के बाद इसे फिर से सक्रिय करना चाहते हैं, तो आप Device.StartTimer फिर से फोन करना होगा । इसे अपनी कक्षा में लपेटना अच्छा होगा जहां आप एक निजी सदस्य का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि एक सतत कार्य अभी भी चल रहा है या नहीं। कुछ इस तरह:

public class DeviceTimer 
{ 
    readonly Action _Task; 
    readonly List<TaskWrapper> _Tasks = new List<TaskWrapper>(); 
    readonly TimeSpan _Interval; 
    public bool IsRecurring { get; } 
    public bool IsRunning => _Tasks.Any(t => t.IsRunning); 

    public DeviceTimer(Action task, TimeSpan interval, 
    bool isRecurring = false, bool start = false) 
    { 
    _Task = task; 
    _interval = interval; 
    IsRecurring = isRecurring; 
    if (start) 
     Start(); 
    } 

    public void Restart() 
    { 
    Stop(); 
    Start(); 
    } 

    public void Start() 
    { 
    if (IsRunning) 
     // Already Running 
     return; 

    var wrapper = new TaskWrapper(_Task, IsRecurring, true); 
    _Tasks.Add(wrapper); 

    Device.StartTimer(_interval, wrapper.RunTask); 
    } 

    public void Stop() 
    { 
    foreach (var task in _Tasks) 
     task.IsRunning = false; 
    _Tasks.Clear(); 
    } 


    class TaskWrapper 
    { 
    public bool IsRunning { get; set; } 
    bool _IsRecurring; 
    Action _Task; 
    public TaskWrapper(Action task, bool isRecurring, bool isRunning) 
    { 
     _Task = task; 
     _IsRecurring = isRecurring; 
     IsRunning = isRunning; 
    } 

    public bool RunTask() 
    { 
     if (IsRunning) 
     { 
     _Task(); 
     if (_IsRecurring) 
      return true; 
     } 

     // No longer need to recur. Stop 
     return IsRunning = false; 
    } 
    }   
} 
+0

समस्या का काम करना चाहिए, जिस पर मुझे सामना करना पड़ रहा है, अगर यह किसी अन्य पृष्ठ पर भी नेविगेट करता है, तो यह टाइमर चालू रहता है और चल रहा है। आपका समाधान वादा करता है लेकिन सवाल है कि जब उपयोगकर्ता पृष्ठ से नेविगेट करता है तो कार्रवाई/घटना को रोकना चाहिए() फ़ंक्शन। अगर मैं ऑनडिस्प्लेयरिंग एक्शन का उपयोग करता हूं, तो यह तब भी ट्रिगर होता है जब स्क्रीन लॉक हो जाती है या ऐप पृष्ठभूमि में लिया जाता है। मैं बैकबटन दबाए गए ईवेंट का भी उपयोग नहीं कर सकता, क्योंकि सॉफ़्टवेयर बैक बटन दबाए जाने पर इसे एंड्रॉइड पर निकाल दिया नहीं जाएगा। तुम क्या सोचते हो? – batmaci

+0

मैंने आपके प्रयोग परिणामों के साथ अपना कोड अपडेट किया। अगर आपको कोई आपत्ति हो, तो इसे मुक्त करने के लिए स्वतंत्र महसूस करें। – Shimmy

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