C#多线程与多任务

c#教程icon-default.png?t=LBL2https://www.xin3721.com/eschool/CSharpxin3721/

此处介绍了多线程和多任务简单使用:

1、多线程 Thread,可传入参数

调用:

string id = "123456";
string name = "qt";
var data = new Data { Id = id,Name = name };
Thread t = new Thread(MainThreadWithParam);
t.Start(data);  // 传入参数

参数封装:

public struct Data
{
    public string Id;
    public string Name;
}

执行业务方法:

复制代码

private object mylock = new object();//异步锁,防止多个线程调用同一个方法,应对该方法不支持并发操作的情况

// 定义线程方法:
private void MainThreadWithParam(object o)
{
    Monitor.Enter(this.mylock);//启用异步锁
    Data d = (Data)o;  //类型转换
    Console.WriteLine("Running in a thread, received {0}-{1}", d.Id,d.Name);
    string id = d.Id;
    string name = d.Name;
    //用户逻辑代码 --todo

    Monitor.Exit(this.mylock);//关闭异步锁
}

复制代码

 2、多任务  Task

ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
  ◆ ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
  ◆ ThreadPool不支持线程执行的先后次序;
  以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的API。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。

调用:

复制代码

string id = "123456";
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
token.Register(() =>
{
    Console.WriteLine("task任务取消");
});
var task = Task.Factory.StartNew(() =>
{
    Console.WriteLine("执行task任务");
    //执行多任务方法
    MainTaskWithParam(id, tokenSource);
}, token);

复制代码

业务方法:

复制代码

private void MainTaskWithParam(string id, CancellationTokenSource tokenSource) 
{
    //业务逻辑代码 --todo

    tokenSource.Cancel();//取消任务
}

复制代码

总结: 实践是检验真理的唯一标准。

参考:https://www.cnblogs.com/zhaoshujie/p/11082753.html

 

出  处:https://www.cnblogs.com/qiantao/p/15615027.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值