如何在C#

时间:2017-07-01 07:38:16

标签: multithreading winforms c#-4.0

我的情况是我必须在Task.Run循环

中使用ForEach

要求: 我将被迫手动杀死线程 我有一个按钮,我可以在For循环中启动和停止此ThreadTask.Run

问题 我的问题是当我启动Task.Run方法时它正在运行但是当我尝试使用CancellationTokenSourcerunningTaskThread.Abort();停止它时它不会被杀死。它刚刚停止,当我启动新的Task.Run时,它运行旧线程,因此它在每个启动过程中都成为多个线程。

代码:

以下是我的启动代码

的代码
 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);
                                }

停止Task.Run

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

我还将ThreadThread.Abort一起使用,但它无效

请帮助解决此问题

1 个答案:

答案 0 :(得分:0)

我使用timer.Stop(),timer.Dispose()获得了解决方案。在创建Thread时,我正在调用SetUpTimer,这个SetupTimer我创建了多个计时器。

因此,在停止线程的调用中,我已经处理了计时器并为我工作

供参考,见下面的代码

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);
        }

    }