2017-07-01 7 views
0

ich Situation, wo ich Task.Run In meiner ForEach Schleife verwenden mußWie töten oder Abort Task.Run oder Task.Factory.StartNew() in C#

Voraussetzung: Ich werde gezwungen werden Thread manuell zu töten Ich habe Knopf, wo ich diese Thread oder Task.Run in For Schleife starten und stoppen kann.

Problem Mein Problem ist, wenn ich die Task.Run Methode Sein Lauf starten, aber wenn ich versuche, mit der Verwendung von CancellationTokenSource oder runningTaskThread.Abort(); sie töten wird nicht zu stoppen. Es hört einfach auf, wenn ich neue Task.Run zu der Zeit starte, läuft es mit altem Thread, so dass es bei jedem Startprozess zu mehreren Threads wird.

Code:

Unten ist mein Code für Start Thema

var messages = rootObject.MultiQData.Messages.Where(m => m.TimeStamp > DateTime.Now).OrderBy(x => x.TimeStamp).ToList(); 
           //Simulate MultiQ file in BackGroud 
           if (messages.Count > 0) 
           { 
            cancellationTokenSource = new CancellationTokenSource(); 
            cancellationToken = cancellationTokenSource.Token; 
            Task.Factory.StartNew(
             () => 
             { 
              runningTaskThread = Thread.CurrentThread; 
              messages.ForEach(
               m => SetUpTimer(m, rootObject.MultiQData.Connection.FleetNo)); 
             }, cancellationToken); 
           } 

Für Anschlag Task.Run

if (cancellationTokenSource != null) 
      { 
       if (cancellationToken.IsCancellationRequested) 
        return; 
       else 
        cancellationTokenSource.Cancel(); 
      } 

ich auch Thread mit Thread.Abort verwenden haben, aber es arbeitet daran, dieses Problem nicht

Bitte Hilfe

Antwort

0

ich timer.Stop(),timer.Dispose() mit bekam Lösung zu lösen. Bei der Erstellung von Thread rufe ich SetUpTimer auf und diesen SetupTimer habe ich mehrere Timer erstellt.

Also auf Abruf von Stopp-Thread habe ich für Timer und seine Arbeit verfügen mich

als Referenz siehe unten Code

private void SetUpTimer(Message message, string fleetNo) 
     { 
      var ts = new MessageTimer(); 

      var interval = (message.TimeStamp - DateTime.Now).TotalMilliseconds; 
      interval = interval <= 0 ? 100 : interval; 

      ts.MessageWrapper = new MessageWrapper(message, fleetNo); 
      ts.Interval = interval; 
      ts.Elapsed += ts_Elapsed; 
      ts.Start(); 

      //Add timer in to the lost for disposing timer at time of stop Simulation 
      lsTimers.Add(ts); 
     } 
private void StopTask() 
    { 
     try 
     { 
      // Attempt to cancel the task politely 
      if (cancellationTokenSource != null) 
      { 
       if (cancellationToken.IsCancellationRequested) 
        return; 
       else 
        cancellationTokenSource.Cancel(); 
      } 

      //Stop All Timer 
      foreach (var timer in lsTimers) 
      { 
       timer.Stop(); 
       timer.Dispose(); 
      } 
     } 
     catch (Exception ex) 
     { 
      errorLogger.Error("Error while Stop simulation :", ex); 
     } 

    } 
Verwandte Themen