C# 如果用户按';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

如果用户按“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 (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您需要使用取消令牌通知并行循环它需要停止。在这一点上,您用来停止执行的方法取决于您。