从我读到的有关任务的内容来看,以下代码应该取消当前正在执行的任务而不会抛出异常.我的印象是,任务取消的重点是礼貌地"要求"任务停止而不中止线程.
以下程序的输出是:
倾倒异常
[OperationCanceledException]
取消并返回最后计算的素数.
我试图在取消时避免任何例外.我怎么能做到这一点?
void Main()
{
var cancellationToken = new CancellationTokenSource();
var task = new Task<int>(() => {
return CalculatePrime(cancellationToken.Token, 10000);
}, cancellationToken.Token);
try
{
task.Start();
Thread.Sleep(100);
cancellationToken.Cancel();
task.Wait(cancellationToken.Token);
}
catch (Exception e)
{
Console.WriteLine("Dumping exception");
e.Dump();
}
}
int CalculatePrime(CancellationToken cancelToken, object digits)
{
int factor;
int lastPrime = 0;
int c = (int)digits;
for (int num = 2; num < c; num++)
{
bool isprime = true;
factor = 0;
if (cancelToken.IsCancellationRequested)
{
Console.WriteLine ("Cancelling …Run Code Online (Sandbox Code Playgroud) 对于时间/日期驱动的线程应用程序,我正在使用创建new Thread()的线程(并且线程都被放入列表中),其中调用一个运行未定义时间的方法(可以是1秒甚至是一整天) .在此方法中,可以创建新的(子)线程(也可以new Thread()).
现在,当应用程序的线程部分结束时(手动或因为程序结束),我将浏览我创建的线程列表并手动结束.
现在据我所知,创建子线程的线程的结束(因此创建第二个线程的方法的线程)并不意味着子线程的结束.所以我的问题是:是否有任何好的方法来管理它,线程杀死会对其子级进行级联(或者我误解了线程在那里的工作方式?).
编辑:有问题:这里提到的所有线程都是后台线程(因此后台进程创建一个子进程进程,该进程将在父进程结束时结束).