首页 新闻 会员 周边 捐助

大牛们好,我想做个个多任务程序。。。

0
悬赏园豆:60 [已解决问题] 解决于 2013-08-20 19:52

例如

1
2
3
4
5
    任务1(方法1);
    任务2(方法2);
    任务3(方法3);
    任务4(方法4);
    .....

同时执行N个任务
我可以新建任务也可以分别结束暂停其中任意一个任务。
请问这应该怎么做。哪位大牛给个演示。或者详细说明下 
谢谢谢谢。。。

AdinZ的主页 AdinZ | 初学一级 | 园豆:26
提问于:2013-08-13 15:59
< >
分享
最佳答案
1

请参看 .Net 4.0 中的 PPL,TPL。

使用 Task<T>, TaskFactory 实现。

收获园豆:60
Launcher | 高人七级 |园豆:45050 | 2013-08-13 16:03

大哥能给点详细说明吗?

AdinZ | 园豆:26 (初学一级) | 2013-08-13 16:06

@Launcher: 看不懂能给个演示吗? 感激不尽...

AdinZ | 园豆:26 (初学一级) | 2013-08-14 12:28

@AdinZ: 我的演示也是 MSDN 上的:http://msdn.microsoft.com/zh-cn/library/vstudio/dd537607.aspx

Launcher | 园豆:45050 (高人七级) | 2013-08-14 13:14

大哥我能在问你个问题吗?

 

Task[] tasks = new Task[4];可以添加4个任务 
假如我同时运行4个任务。我如何停止其中一个呢?
tasks[0] = Task.Factory.StartNew(() => DoSomeWork(1, token), token);
tasks[1] = Task.Factory.StartNew(() => DoSomeWork(1, token), token);
tasks[2] = Task.Factory.StartNew(() => DoSomeWork(1, token), token);
只能运行4个。在添加一个就报错。请问如何删除其中一个 在添加一个任务呢?
能加qq帮帮吗? 630555865 感谢感谢。。。。。
AdinZ | 园豆:26 (初学一级) | 2013-08-19 22:28

@Launcher:  你好 看不懂。。你能给个例子吗?

AdinZ | 园豆:26 (初学一级) | 2013-08-20 17:00

@AdinZ: 例子来了,我把他的代码复制过来:

 

        static void Main(string[] args)
        {
            // create the cancellation token source
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            // create the cancellation token
            CancellationToken token = tokenSource.Token;
            // create the task

            Task task = new Task(() =>
            {
                for (int i = 0; i < int.MaxValue; i++)
                {
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine("Task cancel detected");
                        throw new OperationCanceledException(token);
                    }
                    else
                    {
                        Console.WriteLine("Int value {0}", i);
                    }
                }
            }, token);

            // wait for input before we start the task
            Console.WriteLine("Press enter to start task");
            Console.WriteLine("Press enter again to cancel task");
            Console.ReadLine();

            // start the task
            task.Start();

            // read a line from the console.
            Console.ReadLine();

            // cancel the task
            Console.WriteLine("Cancelling task");
            tokenSource.Cancel();

            // wait for input before exiting
            Console.WriteLine("Main method complete. Press enter to finish.");
            Console.ReadLine();
        }
Launcher | 园豆:45050 (高人七级) | 2013-08-20 17:05

@Launcher: 我怎么感觉他这是停止全部

tasks[0] = Task.Factory.StartNew(() => DoSomeWork(1, token), token);
tasks[1] = Task.Factory.StartNew(() => DoSomeWork(1, token), token);
tasks[2] = Task.Factory.StartNew(() => DoSomeWork(1, token), token);

你看我这 是同时运行好几组。 我如何来停止其中一组呢
AdinZ | 园豆:26 (初学一级) | 2013-08-20 17:19

@AdinZ: 当程序员,一定要学会举一反三,不然你就无法应对需求的变动 ,而需求总是不停变动的:

CancellationTokenSource[] tokenSource = new CancellationTokenSource[4];

CancellationToken[] token = new CancellationToken[] {tokenSource[0].Token,tokenSource[1].Token,tokenSource[2].Token,tokenSource[3].Token}

 

tasks[0] = Task.Factory.StartNew(() => DoSomeWork(1, token[0]), token[0]);
tasks[
1] = Task.Factory.StartNew(() => DoSomeWork(1, token[1]), token[1]);
tasks[
2] = Task.Factory.StartNew(() => DoSomeWork(1, token[2]), token[2]);

 

PS:说实话,我从来没写过使用 Task 的代码。

Launcher | 园豆:45050 (高人七级) | 2013-08-20 17:24

@Launcher: 

谢谢你了 你真是个大号人呢!

CancellationToken[] token = new CancellationToken[]{tokenSource[0].Token,tokenSource[1].Token,tokenSource[2].Token,tokenSource[3].Token}

运行到这里提示 未将对象实例化!

是什么原因啊?

AdinZ | 园豆:26 (初学一级) | 2013-08-20 17:32

@AdinZ:

CancellationTokenSource[] tokenSource = new CancellationTokenSource[]{new CancellationTokenSource(),

new CancellationTokenSource(),new CancellationTokenSource(),new CancellationTokenSource} ;

Launcher | 园豆:45050 (高人七级) | 2013-08-20 17:44

@Launcher: 

呜呜~~~~

绝望了。。竟然停止不了。。。

我能付费找你帮我做个吗?QQ630555865

AdinZ | 园豆:26 (初学一级) | 2013-08-20 19:52

@AdinZ: 不能。

Launcher | 园豆:45050 (高人七级) | 2013-08-21 09:10
其他回答(3)
0

有个多线程组件SmartThreadPool

http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-08-13 18:28

没有暂停和停止呀

支持(0) 反对(0) AdinZ | 园豆:26 (初学一级) | 2013-08-14 12:26

@AdinZ: 暂停你指的是怎么个暂停.?线程直接挂起么.?用另一个线程是无法控制当前线程做sleep的吧.?

如果是暂停执行任务,应该是可以的啊.

支持(0) 反对(0) 只会造轮子 | 园豆:2274 (老鸟四级) | 2013-08-14 13:41
0
dudu | 园豆:30939 (高人七级) | 2013-08-14 10:03

这个不可以暂停其中的某个线程

支持(0) 反对(0) AdinZ | 园豆:26 (初学一级) | 2013-08-14 12:26
0

多线程基本可解决。

angelshelter | 园豆:9914 (大侠五级) | 2013-08-14 12:04

给个解决方案呗!

支持(0) 反对(0) AdinZ | 园豆:26 (初学一级) | 2013-08-14 12:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册