Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何请求任务停止工作?_C#_Task Parallel Library - Fatal编程技术网

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);
}
我的代码不起作用-任务永远不会结束。我猜由于某种原因,他们没有收到fresh
stayConnected=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)
是可行的,但最佳做法是使用异常来确定任务是否已完成或取消,并以不同的方式处理此情况。在无限循环的情况下,不需要例外。