超时后如何取消线程

普拉萨德·卡纳帕蒂(Prasad Kanaparthi)

我有一个多线程应用程序,我正在用来控制进程数(2)。我只想在指定的时间内处理文件。下面是我的方法。我收到的CancellationTokenSource已处置。错误。

如果我没有分配,cts.Dispose();则该过程不会在10秒后弯腰。它一直在处理,直到1000年。这里有谁能帮助我。

注意:我有1000个文件。通过控制进程数(2)和介于两者之间的睡眠时间(大约x毫秒),要求在给定的时间(10秒)内具有进程文件。

下面是我的代码

class Program
{
    static void Main(string[] args)
    {
        try
        {
            LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(2);
            List<Task> tasks = new List<Task>();
            TaskFactory factory = new TaskFactory(lcts);
            CancellationTokenSource cts = new CancellationTokenSource();

            for (int i = 0; i < 1000; i++)
            {
                int i1 = i;
                var t = factory.StartNew(() =>
                {
                    if (cts != null)
                        Console.WriteLine("{0} --- {1}", i1, GetGuid(cts.Token));
                }, cts.Token);

                tasks.Add(t);
            }

            Task.WaitAll(tasks.ToArray(), 10000, cts.Token);
            cts.Dispose();
            Console.WriteLine("\n\nSuccessful completion.");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    private static Guid GetGuid(CancellationToken cancelToken)
    {
        if (cancelToken.IsCancellationRequested)
        {
            return Guid.Empty;
        }
        Thread.Sleep(TimeSpan.FromSeconds(1));
        return Guid.NewGuid();
    }
}
法比安

您可以做的是,您可以运行一个任务,该任务将在一段时间后将您的“取消令牌”状态更改为“已取消”。

像这样 :

class Program
{
    public static void ProcessFiles(CancellationToken cts)
    {            
        try
        {                
            LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(2);
            List<Task> tasks = new List<Task>();
            TaskFactory factory = new TaskFactory(lcts);                

            for (int i = 0; i < 1000; i++)
            {
                int i1 = i;
                var t = factory.StartNew(() =>
                {
                    if (cts != null) Console.WriteLine("{0} --- {1}", i1, GetGuid());
                }, cts);

                tasks.Add(t);
            }

            Task.WaitAll(tasks.ToArray());

            Console.WriteLine("\n\nSuccessful completion.");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    static void Main(string[] args)
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        Task.Factory.StartNew(() => { Thread.Sleep(10000); cts.Cancel(); });
        ProcessFiles(cts.Token);
        Console.ReadKey();
    }

    private static Guid GetGuid()
    {
        Thread.Sleep(TimeSpan.FromSeconds(1));
        return Guid.NewGuid();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在超时后取消任务等待

来自分类Dev

如何在超时后杀死Selenium“ Click”线程

来自分类Dev

如何取消延迟的线程?

来自分类Dev

如何取消对象内的超时

来自分类Dev

时间开始后,Android取消超时功能

来自分类Dev

Angular 2 - 超时后取消订阅

来自分类Dev

取消路由更改后取消angularjs超时不起作用

来自分类Dev

如何中断否则超时的线程?

来自分类Dev

python:超时后如何在单独的线程中终止Excel会话?

来自分类Dev

如何使用QThreadPool取消线程

来自分类Dev

使用sched_setaffinity固定到核心后,如何取消固定线程?

来自分类Dev

如何取消Javascript Promise内部的超时?

来自分类Dev

如何使用超时取消TaskCompletionSource

来自分类Dev

如何中断或取消SimPy超时事件?

来自分类Dev

如何取消当前应用的剩余sudo超时?

来自分类Dev

如何使用超时打破/取消forEach循环

来自分类Dev

如何取消当前应用的剩余sudo超时?

来自分类Dev

如何使用超时取消TaskCompletionSource

来自分类Dev

用户执行点击时如何取消超时

来自分类Dev

NSOperationQueue:在给出超时后取消操作

来自分类Dev

如何使Spring Boot @Scheduled线程超时

来自分类Dev

如何取消后台运行的线程?(iOS)

来自分类Dev

在执行器中从内部取消任务,或在超时后从外部取消任务

来自分类Dev

在执行器中从内部取消任务,或在超时后从外部取消任务

来自分类Dev

取消绑定操作后,Android Binder线程正在运行

来自分类Dev

如何“休眠”直到.NET 4.0中的超时或取消请求

来自分类Dev

如何-具有超时和取消功能的多个异步任务

来自分类Dev

如何为不接受取消令牌的异步函数设置超时?

来自分类Dev

如何在Android中设置可取消的超时

Related 相关文章

热门标签

归档