C# Task 多线程

Task类在命名空间System.Threading.Tasks下,通过Task的Factory返回TaskFactory类,以TaskFactory.StartNew(Action)方法可以创建一个新的异步线程,所创建的线程默认为后台线程,不会影响前台UI窗口的运行。

如果要取消线程,可以利用CancellationTakenSource对象。如果要在取消任务后执行一个回调方法,则可以使用Task的()方法。

Task的用法

利用Task对之前的例子进行重写和扩展。代码如下。

 

复制代码
namespace ThreadDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建CancellationTokenSource对象用于取消Task
            CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

            Fish fish1 = new Fish() { Name = "小黄鱼", Score = 1 };
            Fish fish2 = new Fish() { Name = "大鲨鱼", Score = 100 };

            // 创建一个Task
            Task task1 = new Task(() => fish1.Move(cancelTokenSource.Token), cancelTokenSource.Token);
            task1.Start();

            // Task1被取消后的回调方法(小黄鱼被击中后显示积分)
            task1.ContinueWith(fish1.ShowScore);

            Task task2 = new Task(() => fish2.Move(cancelTokenSource.Token), cancelTokenSource.Token);
            task2.Start();
            task2.ContinueWith(fish2.ShowScore);

            // 按任意键发射
            Console.ReadKey();

            // 武器工厂线程池
            Gun gun = new Gun();
            LaserGun laserGun = new LaserGun();
            TaskFactory taskFactory = new TaskFactory();
            Task[] tasks = new Task[] 
            {
                taskFactory.StartNew(()=>gun.Fire()),
                taskFactory.StartNew(()=>laserGun.Fire())
            };

            // 执行武器开火
            taskFactory.ContinueWhenAll(tasks, (Task) => { });

            cancelTokenSource.Cancel();
            Console.ReadKey();
        }
    }

    /// <summary>
    ////// </summary>
    public class Fish
    {
        public string Name { get; set; }

        public int Score { get; set; }

        public Fish()
        {
        }

        public void Move()
        {
            Console.WriteLine(string.Format("{0}在游来游去...", Name));
        }

        /// <summary>
        /// 游动
        /// </summary>
        /// <param name="cancelToken"></param>
        public void Move(CancellationToken cancelToken)
        {
            while (!cancelToken.IsCancellationRequested)
            {
                Console.WriteLine(string.Format("{0}在游来游去...", Name));

                // 阻塞1秒
                Thread.Sleep(1000);
            }
        }

        /// <summary>
        /// 中枪后显示奖励
        /// </summary>
        /// <param name="task"></param>
        public void ShowScore(Task task)
        {
            Console.WriteLine(string.Format("{0}中弹了,你得到{1}分",Name,Score));
        }
    }
}
复制代码

 

 

程序运行结果如下:

猜你喜欢

转载自blog.csdn.net/wshl1234567/article/details/50820744