首页 新闻 搜索 专区 学院

c#牛人进。。

0
[已解决问题] 解决于 2013-01-11 22:21

var source =new CancellationTokenSource();
var token
= source.Token;
var task
= Task.Factory.StartNew(() =>
{
    Console.WriteLine(
"Task starting...");
   
while (true)
    {
        token.ThrowIfCancellationRequested();
        Console.WriteLine(
"I'm alive. {0}",DateTime.Now);
        Thread.Sleep(
1000);
    }
},token);

在c#并行处理中。在实际项目中。不可能使用while(true)这种方式进行循环验证。。如果只是一个方法执行下去。请问怎样取消掉该任务???

彬彬@科比的主页 彬彬@科比 | 初学一级 | 园豆:43
提问于:2013-01-06 22:14
< >
分享
最佳答案
0

研究了下貌似没什么好办法,提供两个参考

1、可能在耗时任务中“常常”if (curToken.IsCancellationRequested){}这样判断是个好习惯。

2、使用token.Regester()+Abort()终止线程,这个好像很偏,后遗症也不知道,代码如下

            var source = new CancellationTokenSource();
            var token = source.Token;
            var task = Task.Factory.StartNew((objToken) =>
            {
                CancellationToken curToken = (CancellationToken)objToken;
                curToken.Register((objThread) =>
                {
                    Thread curThread = objThread as Thread;
                    Console.WriteLine(String.Format("线程ID为{0},Task终止", curThread.ManagedThreadId));
                    curThread.Abort();
                }
                , Thread.CurrentThread);

                Console.WriteLine("Task starting...");
                while (true)
                {
                    Console.WriteLine(String.Format("线程ID为{0},I'm alive. {1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now));
                    Thread.Sleep(1000);
                }
            }, token);

            Thread.Sleep(5000);
            try
            {
                source.Cancel();
            }
            catch
            {
                // 使用curThread.Abort();这里捕获不到异常System.Threading.ThreadAbortException
            }

结果图:

奖励园豆:5
滴答的雨 | 老鸟四级 |园豆:3690 | 2013-01-06 23:30
其他回答(1)
0

while(flag){

//

}

外部改变flag值为false后,循环就结束了。

I,Robot | 园豆:9563 (大侠五级) | 2013-01-06 23:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册