C# 如果用户按';c';
如果用户按“c”,则Parallel.ForEach应在不取消已启动任务的情况下中断。现在我的程序正在等待用户,我该如何做才能让用户在任何时候都可以写“c”,并且当启动的任务完成后程序将取消C# 如果用户按';c';,c#,console-application,C#,Console Application,如果用户按“c”,则Parallel.ForEach应在不取消已启动任务的情况下中断。现在我的程序正在等待用户,我该如何做才能让用户在任何时候都可以写“c”,并且当启动的任务完成后程序将取消 List<int> companies = new List<int> { 56, 1, 18, 26, 37, 45, 47, 50, 56, 60 }; Parallel.ForEach(companies, (company, state) => { if (Co
List<int> companies = new List<int> { 56, 1, 18, 26, 37, 45, 47, 50, 56, 60 };
Parallel.ForEach(companies, (company, state) =>
{
if (Console.ReadKey().KeyChar == 'c')
{
state.Break();
}
MyFunction(company);
});
上市公司=新上市公司{56,1,18,26,37,45,47,50,56,60};
Parallel.ForEach(公司,(公司,州)=>
{
if(Console.ReadKey().KeyChar=='c')
{
state.Break();
}
我的职能(公司);
});
编辑-最终解决方案:
try
{
List<int> companies = new List<int> { 78, 1, 18, 26, 37, 45, 47, 50, 56, 60 };
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
Task.Factory.StartNew(() =>
{
if (Console.ReadKey().KeyChar == 'c')
{
cts.Cancel();
}
});
Parallel.ForEach(companies, (company, state) =>
{
MyFunction(company);
po.CancellationToken.ThrowIfCancellationRequested();
});
}
catch (OperationCanceledException ex)
{
Console.WriteLine("Cancelled program");
}
试试看
{
上市公司=新名单{78,1,18,26,37,45,47,50,56,60};
CancellationTokenSource cts=新的CancellationTokenSource();
ParallelOptions po=新的ParallelOptions();
po.CancellationToken=cts.Token;
Task.Factory.StartNew(()=>
{
if(Console.ReadKey().KeyChar=='c')
{
cts.Cancel();
}
});
Parallel.ForEach(公司,(公司,州)=>
{
我的职能(公司);
po.CancellationToken.ThrowIfCancellationRequested();
});
}
捕捉(操作取消例外)
{
控制台写入线(“取消的程序”);
}
您的控制台。ReadKey
方法调用不应位于Parallel.ForEach
内,而应直接位于它的后面
然后,使用该读取密钥使用CancellationToken取消foreach
请参阅:可能的重复项也当在“MyFunction”部分它不会终止时,您确实意识到您的请求完全没有意义吗?使用
取消令牌传递并行选项:并行。ForEach(公司,选项,(公司,州)=>{…}
所以我必须使用取消令牌,而不是state.Break()?@AleksanderChelpski阅读了答案中链接的文章。它准确地显示了您试图实现的目标。@AleksanderChelpski您需要使用取消令牌通知并行循环它需要停止。在这一点上,您用来停止执行的方法取决于您。