0

我正在使用这样的代码:

private Task[] tasks;
private volatile bool stayConnected;

....

tasks[i] = Task.Factory.StartNew(() =>
{
    while (stayConnected) {
        ...
    }
}

....

public void Disconnect()
{
    stayConnected = false;
    Task.WaitAll(tasks);
}

我的代码不起作用 - 任务永远不会结束。我猜他们由于某种原因没有收到新stayConnected = false的价值,可能只是声明字段volatile是不够的。

指示任务停止工作的正确方法是什么?我不想“杀死”任务,而是想“请求”完成任务。

我发现这篇文章建议使用 CancellationToken,我应该使用它还是您可以提出更好的建议?我可以将一个 CancellationToken 用于多个任务吗?

同样有趣的是为什么我的初始代码不起作用。

4

1 回答 1

2

最好使用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);
}
于 2013-09-16T10:21:21.497 回答