c#如何设置函数最长执行时间(.net 4.5)

黎大 2017-03-20 10:47:41
问题:
需要处理大量数据(大量零碎文件),主程序在后台调用了函数doIt(),拟在规定的时间内处理完每一个零碎文件,如果不能处理完(超时了),则直接退出这个函数。
这个功能应该怎样实现呢?
java里面提供了future接口来监控,那么c#(.net 4.5)有没有类似的功能实现呢?

多谢多谢啦!
...全文
798 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
黎大 2018-02-05
  • 打赏
  • 举报
回复
引用 9 楼 bloodish 的回复:
task加cancellationtoken是个不错的选择,但我个人比较喜欢用wait handle来处理这样的需求

static void Main(string[] args)
        {
            var execWaitHandle = new AutoResetEvent(false);
            var stopWaitHandle = new AutoResetEvent(false);

            Task.Factory.StartNew(() => { DoIt(stopWaitHandle, execWaitHandle); });
            const int timeout = 10000;
            if(!execWaitHandle.WaitOne(timeout))//if wait timeout and return false
            {
                if(stopWaitHandle.WaitOne())//make sure stop success
                {
                    //todo
                }
            }
        }

        static void DoIt(AutoResetEvent stopWaitHandle, AutoResetEvent execWaitHandle)
        {
            while(true)
            {
                //todo, write your business logic here
                if(stopWaitHandle.WaitOne(0)) //if not set, continue your business logic
                {
                    break;
                }
            }
            execWaitHandle.Set();
        }
我尝试用了task+cancellationtoken,好像还比较麻烦! 您有没有用这个例子?
绿领巾童鞋 2017-06-02
  • 打赏
  • 举报
回复
引用 12 楼 wanghui0380 的回复:
CancelTokenSource cts=new CancelTokenSource(1000) //1000毫秒触发 CancelToken Token=cts.Token; Task.run(()=>你要做的事情,token) 当然你直接使用 task的wait方法也行,不过通常来说我个人使用CancelTokenSource去控制,因为我希望保留其他的方式去停止任务(比如你可以让他1000毫秒自动停止,我也能保留不到1000毫秒我手动触发他停止)
不错 不错 ,又学到一招
wanghui0380 2017-06-01
  • 打赏
  • 举报
回复
CancelTokenSource cts=new CancelTokenSource(1000) //1000毫秒触发 CancelToken Token=cts.Token; Task.run(()=>你要做的事情,token) 当然你直接使用 task的wait方法也行,不过通常来说我个人使用CancelTokenSource去控制,因为我希望保留其他的方式去停止任务(比如你可以让他1000毫秒自动停止,我也能保留不到1000毫秒我手动触发他停止)
nikyotensai 2017-06-01
  • 打赏
  • 举报
回复
bloodish 2017-06-01
  • 打赏
  • 举报
回复
对不起,有段错误代码,重新写一下

if(!execWaitHandle.WaitOne(timeout))//if wait timeout and return false
            {
                stopWaitHandle.Set();
                if (execWaitHandle.WaitOne())//make sure stop success
                {
                    //todo
                }
            }
bloodish 2017-06-01
  • 打赏
  • 举报
回复
task加cancellationtoken是个不错的选择,但我个人比较喜欢用wait handle来处理这样的需求

static void Main(string[] args)
        {
            var execWaitHandle = new AutoResetEvent(false);
            var stopWaitHandle = new AutoResetEvent(false);

            Task.Factory.StartNew(() => { DoIt(stopWaitHandle, execWaitHandle); });
            const int timeout = 10000;
            if(!execWaitHandle.WaitOne(timeout))//if wait timeout and return false
            {
                if(stopWaitHandle.WaitOne())//make sure stop success
                {
                    //todo
                }
            }
        }

        static void DoIt(AutoResetEvent stopWaitHandle, AutoResetEvent execWaitHandle)
        {
            while(true)
            {
                //todo, write your business logic here
                if(stopWaitHandle.WaitOne(0)) //if not set, continue your business logic
                {
                    break;
                }
            }
            execWaitHandle.Set();
        }
黎大 2017-06-01
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
你在“处理大量数据(大量零碎文件)”的时候,是否具有报告处理进度的机制?怎么报告的?
之前用的backgroundworker,结束后会有返回值。。。
  • 打赏
  • 举报
回复
你在“处理大量数据(大量零碎文件)”的时候,是否具有报告处理进度的机制?怎么报告的?
  • 打赏
  • 举报
回复
你的“直接退出这个函数”的意思是想任意破坏它、随机地抛出异常吗?
Poopaye 2017-03-22
  • 打赏
  • 举报
回复
开2个线程,一个执行doit,一个即时,时间一到在第一个上abort 虽然可能有后遗症
黎大 2017-03-22
  • 打赏
  • 举报
回复
@xdashewan 这个方案可行性最高,已经开始 @hanjun0612 谢谢,我并非要监控目录,而是处理某个文件时会超时
xdashewan 2017-03-20
  • 打赏
  • 举报
回复
task和CancellationTokenSource? https://msdn.microsoft.com/zh-cn/library/system.threading.cancellationtokensource.aspx
xuggzu 2017-03-20
  • 打赏
  • 举报
回复
如果是循环处理就很简单了,用系统时钟计时,循环中判断累计时间是否超时即可。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧