最佳答案
我正在从一个函数启动一个新任务,但我不希望它在同一个线程上运行。我不在乎它运行在哪个线程上,只要它是一个不同的线程(所以 这个问题中给出的信息没有帮助)。
我是否保证下面的代码总是在允许 Task t
再次输入之前退出 TestLock
?如果没有,建议采用什么样的设计模式来防止重入?
object TestLock = new object();
public void Test(bool stop = false) {
Task t;
lock (this.TestLock) {
if (stop) return;
t = Task.Factory.StartNew(() => { this.Test(stop: true); });
}
t.Wait();
}
编辑: 基于 Jon Skeet 和 Stephen Toub 下面的回答,一个确定性地防止重入的简单方法是传递一个 CancelationToken,如下面的扩展方法所示:
public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action)
{
return taskFactory.StartNew(action: action, cancellationToken: new CancellationToken());
}