使用功能时,我需要取消Parallel.For的所有任务。 例如:
class Example
{
private CancellationTokenSource cts;
public Example()
{
cts = new CancellationTokenSource();
}
public void plsCompute()
{
ParallelOptions po = new ParallelOptions{ CancellationToken = cts.Token };
Parallel.For(0, 10, po, (i) => compute());
}
public void plsStopComputing()
{
cts.Cancel();
}
public void compute()
{
for(int i=0;i<100000;i++){
if(//token was cancelled){
Console.WriteLine("Cancelled");
return;
}
//do something
}
}
我需要停止当前正在运行的所有任务,而不是创建新任务。
有什么办法可以做到这一点?
我看到的所有示例都是使用lambda中的函数编写的,因此可以访问cts。我需要其他功能。另外,如果我将令牌作为参数传递,则它不起作用。 cts令牌已更改,但在其他线程中未更改。
任何需要帮助的人:)
正如我在评论中提到的那样,我更加深入,这个例子并不是我真正想要的。这些方法由wpf应用程序通过msmq发送的消息调用。我认为每次我从wpf调用时,service都会创建此类的新实例,因此它将取消新实例,而不是已经在计算的实例。 有没有办法调用同一实例?
答案 0 :(得分:0)
问题在于msmq调用,每次收到消息时,都会创建一个新的class实例。 我已经解决了
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
在实现服务的类的声明之上