C# 多线程task

部署运行你感兴趣的模型镜像
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;


namespace 多线程Task
{
    class Program
    {
        static void Main(string[] args)
        {
            Task task = new Task(
                () =>
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Console.WriteLine("Index:{0},ThreadID:{1}",i,Thread.CurrentThread.ManagedThreadId);
                        Thread.Sleep(1000);
                    }
                });
            //在使用能够Task类的Wait方法等待一个任务时或派生类的Result属性获得任务执行结果都有可能阻塞线程,
            //为了解决这个问题可以使用ContinueWith方法,他能在一个任务完成时自动启动一个新的任务来处理执行结果。
            task.ContinueWith(t =>
                {
                    Console.WriteLine("执行完毕!,ThreadID:{0}",  Thread.CurrentThread.ManagedThreadId);
                });
            task.Start();


            Console.WriteLine("主线程执行完毕!ThreadID:{0}",Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();


        }
    }
}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>我们正在讨论C#中的多线程Task使用。根据引用,Task是更高级、更易于使用的多线程编程模型。我们将提供使用指南和示例。首先,Task是System.Threading.Tasks命名空间中的类,用于表示异步操作。它比直接使用Thread更高效且易于管理。主要使用方式:1.使用Task.Run来启动后台任务。2.使用Task.WaitAll或Task.WaitAny来等待任务完成。3.使用Task.Delay来模拟耗时操作(非阻塞的等待)。示例1:启动两个任务并等待它们完成(如引用[1]所示)示例2:使用async/await进行异步编程(引用[3]提到状态机,这是更现代的方式)我们将提供两个示例:示例一:使用Task.Run和WaitAll(同步等待)示例二:使用async和await(异步等待,不阻塞主线程)注意:在示例中,我们使用Console.WriteLine输出信息,以便观察线程执行情况。另外,我们还需要注意异常处理、取消操作等,但用户问题主要是使用指南,我们先提供基础示例。根据引用[2],Task.Run用于在后台线程执行操作,主线程可以继续执行其他代码。现在,我们编写两个示例代码。</think>### C# 多线程 Task 使用指南 TaskC# 多线程编程的核心组件,它基于 TPL(Task Parallel Library)提供高效的线程管理。以下是关键使用方法和示例: #### 一、基础用法 1. **启动任务** ```csharp // 方式1:Task.Run Task task1 = Task.Run(() => { Console.WriteLine("任务1执行中"); Thread.Sleep(1000); }); // 方式2:Task.Factory.StartNew Task task2 = Task.Factory.StartNew(() => { Console.WriteLine("任务2执行中"); }); ``` 2. **等待任务完成** ```csharp task1.Wait(); // 阻塞当前线程直到完成 Task.WaitAll(task1, task2); // 等待所有任务 Task.WaitAny(task1, task2); // 等待任意任务完成 ``` #### 二、返回值处理 ```csharp Task<int> calcTask = Task.Run(() => { Thread.Sleep(500); return 42; // 返回计算结果 }); // 获取结果(会阻塞线程直到完成) int result = calcTask.Result; ``` #### 三、异步编程 (async/await) ```csharp static async Task Main() { Task<int> dataTask = FetchDataAsync(); Console.WriteLine("等待数据时主线程可继续工作"); int data = await dataTask; // 非阻塞等待 Console.WriteLine($"获取数据: {data}"); } static async Task<int> FetchDataAsync() { await Task.Delay(1000); // 模拟IO操作 return new Random().Next(100); } ``` #### 四、任务链式调用 ```csharp Task.Run(() => Step1()) .ContinueWith(t => Step2(t.Result)) .ContinueWith(t => Step3(t.Result)); ``` #### 五、异常处理 ```csharp try { Task faultedTask = Task.Run(() => throw new Exception("测试异常")); faultedTask.Wait(); } catch (AggregateException ae) { foreach (var e in ae.InnerExceptions) { Console.WriteLine($"捕获异常: {e.Message}"); } } ``` #### 六、取消任务 ```csharp var cts = new CancellationTokenSource(); Task longTask = Task.Run(() => { while (true) { cts.Token.ThrowIfCancellationRequested(); Thread.Sleep(100); } }, cts.Token); cts.CancelAfter(1000); // 1秒后取消 ``` > **最佳实践** > 1. CPU密集型操作使用`Task.Run` > 2. IO操作使用`async/await` > 3. 避免`.Result`阻塞,优先用`await` > 4. 使用`CancellationToken`支持任务取消[^1][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值