我的情况是我必须在Task.Run
循环
ForEach
要求:
我将被迫手动杀死线程
我有一个按钮,我可以在For循环中启动和停止此Thread
或Task.Run
。
问题
我的问题是当我启动Task.Run方法时它正在运行但是当我尝试使用CancellationTokenSource
或runningTaskThread.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();
}
我还将Thread
与Thread.Abort
一起使用,但它无效
请帮助解决此问题
答案 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); } }