等同于线程的.NET核心。中止 [英] .NET Core equivalent to Thread.Abort

查看:31
本文介绍了等同于线程的.NET核心。中止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

背景

我有一个Service抽象。每个服务都有自己的WorkItem。能够从一些数据开始的工作项。该服务正在限制WorkItem的执行时间。假设单个工作项最多需要60秒。在此之后,Service应该会杀死它。

此代码从.NET框架迁移而来,我创建了一个运行Start(model)方法的Thread对象。然后代码类似于:

Thread t = new Thread(workItem.Start, model);
t.start();
if (!t.Join(TimeSpan.FromSeconds(60)))
    t.Abort();

Thread.Abort正在为正在运行的线程注入异常,导致其立即停止。

现在,我将代码移到DotNet core-如您所知,当您调用Thread.Abort()时,收到以下消息:

System.PlatformNotSupportedException: Thread abort is not supported on this platform.
   at System.Threading.Thread.Abort()
   at ...

目标

我希望将WorkItem的执行时间限制为特定的时间量。请注意,如果您运行如下代码行,则此限制也应该起作用:

Thread.Sleep(61000); // 61 seconds. should be stop after 60 seconds.

进度

在DotNet的核心世界中,它似乎要走向Task相关的解决方案。所以,我想用CancellationToken。但看着被取消的活动并立即停止似乎是不可能的。我看到的例子是使用while (!canceled)循环,它不能停止长操作(如Thread.Sleep(1000000)

问题

如何正确操作?

更新

我编写了以下示例代码:

public static bool ExecuteWithTimeLimit(TimeSpan timeSpan, Action codeBlock)
{
    try
    {
        Task task = Task.Factory.StartNew(() => codeBlock());
        if (!task.Wait(timeSpan))
        {
            // ABORT HERE!
            Console.WriteLine("Time exceeded. Aborted!");
        }
        return task.IsCompleted;
    }
    catch (AggregateException ae)
    {
        throw ae.InnerExceptions[0];
    }
}

和这个Main文件:

public static void Main(string[] args)
{
    bool Completed = ExecuteWithTimeLimit(TimeSpan.FromMilliseconds(2000), () =>
    {
        Console.WriteLine("start");
        Thread.Sleep(3000);
        Console.WriteLine("end");
    });

    Console.WriteLine($"Completed={Completed}");
    Console.ReadLine();
}
预期:将不会打印到屏幕上。实际:&Q;结束&Q;打印。有没有其他方法可以杀死Task

推荐答案

使用线程。中断();而不是Abort方法。

这篇关于等同于线程的.NET核心。中止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆