c# - आइब - थ्रेडिंग बनाने का तरीका हिंदी में




सिस्टम। थ्रेडिंग। सी#में टिमर ऐसा लगता है कि यह काम नहीं कर रहा है। यह हर 3 सेकंड में बहुत तेजी से चलता है (4)

टाइमर को रोकने के लिए जरूरी नहीं है, इस पोस्ट से अच्छा समाधान देखें :

"आप टाइमर को कॉलबैक विधि को फायर करना जारी रख सकते हैं लेकिन मॉनिटर में अपना गैर-पुनर्विक्रेता कोड लपेटें। कोशिश करें / बाहर निकलें। उस मामले में टाइमर को रोकने / पुनरारंभ करने की कोई आवश्यकता नहीं है; ओवरलैपिंग कॉल लॉक प्राप्त नहीं करेंगे और तुरंत वापस आ जाएंगे।"

private void CreatorLoop(object state) 
 {
   if (Monitor.TryEnter(lockObject))
   {
     try
     {
       // Work here
     }
     finally
     {
       Monitor.Exit(lockObject);
     }
   }
 }

मेरे पास टाइमर ऑब्जेक्ट है। मैं इसे हर मिनट चलाने के लिए चाहता हूँ। विशेष रूप से, इसे OnCallBack विधि OnCallBack चाहिए और OnCallBack विधि चल रही है, जबकि निष्क्रिय होनी चाहिए। एक बार OnCallBack विधि समाप्त होने के बाद, यह ( OnCallBack ) टाइमर को पुनरारंभ करता है।

यहां मेरे पास अभी क्या है:

private static Timer timer;

private static void Main()
{
    timer = new Timer(_ => OnCallBack(), null, 0, 1000 * 10); //every 10 seconds
    Console.ReadLine();
}

private static void OnCallBack()
{
    timer.Change(Timeout.Infinite, Timeout.Infinite); //stops the timer
    Thread.Sleep(3000); //doing some long operation
    timer.Change(0, 1000 * 10);  //restarts the timer
}

हालांकि, ऐसा लगता है कि यह काम नहीं कर रहा है। यह हर 3 सेकंड में बहुत तेजी से चलता है। यहां तक ​​कि जब कोई अवधि बढ़ाएं (1000 * 10)। ऐसा लगता है जैसे यह 1000 * 10 लिए एक अंधे आँख बदल जाता है

मैंने गलत क्या किया?


मैं बस करूँगा:

private static Timer timer;
 private static void Main()
 {
   timer = new Timer(_ => OnCallBack(), null, 1000 * 10,Timeout.Infinite); //in 10 seconds
   Console.ReadLine();
 }

  private static void OnCallBack()
  {
    timer.Dispose();
    Thread.Sleep(3000); //doing some long operation
    timer = new Timer(_ => OnCallBack(), null, 1000 * 10,Timeout.Infinite); //in 10 seconds
  }

और अवधि पैरामीटर को अनदेखा करें, क्योंकि आप अपने आप को समय-समय पर नियंत्रित करने का प्रयास कर रहे हैं।

आपका मूल कोड यथासंभव तेज़ी से चल रहा है, क्योंकि आप dueTime पैरामीटर के लिए 0 निर्दिष्ट करते dueTime हैं। Timer.Change से Timer.Change : Timer.Change :

यदि देय समय शून्य (0) है, तो कॉलबैक विधि तुरंत लागू की जाती है।


सिस्टम का उपयोग कर रहा है। थ्रेडिंग। टिमर अनिवार्य है?

यदि नहीं, System.Timers.Timer में आसान स्टार्ट () और रोकें () विधियां हैं (और एक ऑटोरसेट संपत्ति जिसे आप गलत पर सेट कर सकते हैं, ताकि रोक () की आवश्यकता न हो और आप निष्पादन के बाद बस प्रारंभ () को कॉल करें)।


 var span = TimeSpan.FromMinutes(2);
 var t = Task.Factory.StartNew(async delegate / () =>
   {
        this.SomeAsync();
        await Task.Delay(span, source.Token);
  }, source.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

source.Cancel(true/or not);

// or use ThreadPool(whit defaul options thread) like this
Task.Start(()=>{...}), source.Token)

अगर आप अंदर कुछ पाश धागे का उपयोग करना चाहते हैं ...

public async void RunForestRun(CancellationToken token)
{
  var t = await Task.Factory.StartNew(async delegate
   {
       while (true)
       {
           await Task.Delay(TimeSpan.FromSeconds(1), token)
                 .ContinueWith(task => { Console.WriteLine("End delay"); });
           this.PrintConsole(1);
        }
    }, token) // drop thread options to default values;
}

// And somewhere there
source.Cancel();
//or
token.ThrowIfCancellationRequested(); // try/ catch block requred.




timer