C# 如何请求任务停止工作?
我正在使用这样的代码:C# 如何请求任务停止工作?,c#,task-parallel-library,C#,Task Parallel Library,我正在使用这样的代码: private Task[] tasks; private volatile bool stayConnected; .... tasks[i] = Task.Factory.StartNew(() => { while (stayConnected) { ... } } .... public void Disconnect() { stayConnected = false; Task.WaitAll(ta
private Task[] tasks;
private volatile bool stayConnected;
....
tasks[i] = Task.Factory.StartNew(() =>
{
while (stayConnected) {
...
}
}
....
public void Disconnect()
{
stayConnected = false;
Task.WaitAll(tasks);
}
我的代码不起作用-任务永远不会结束。我猜由于某种原因,他们没有收到freshstayConnected=false
值,可能仅仅将字段声明为volatile
是不够的
发出任务停止工作信号的正确方法是什么?
我不想“杀死”任务,而是想“请求”任务完成
我发现这建议使用CancellationToken,我应该使用它还是你可以建议更好的?我可以为多个任务使用一个CancellationToken吗
还有一点很有趣,为什么我的初始代码不起作用。最好使用布尔值
CancellationTokenSource cts;
private Task[] tasks;
void Start()
{
cts = new CancellationTokenSource();
tasks = new Task[1];
tasks [0] = Task.Run(() => SomeWork(cts.Token), cts.Token);
}
void SomeWork(CancellationToken cancellationToken)
{
while (true)
{
// some work
cancellationToken.ThrowIfCancellationRequested();
}
}
void Cancel()
{
cts.Cancel();
Task.WaitAll(tasks);
}
为什么使用
volatile
?因为没有volatile
,它就无法工作。使用volatile
它也不起作用。是的。创建一个CancellationTokenSource将它创建的令牌传递到任务工厂方法中,然后在cts上发出取消信号。我是否应该调用throwifcCancellationRequested
?为什么不将while(true)
替换为while(!ct.iscancellationrequest)
是可行的,但最佳做法是使用异常来确定任务是否已完成或取消,并以不同的方式处理此情况。在无限循环的情况下,不需要例外。