【C#】异步操作,delegate,Thread,Task,async/await

Action与Func

这两个是系统定义好的delegate,Action无返回值,Func有返回值

无返回值

public void A(int i)
{
    Console.WriteLine(i);
} 

 

Action<int> mAct = A;
mAct.BeginInvoke(2, null, null);

结果

 

有返回值

public int B(int i)
{
    return i*i;
}

 

Func<int, int> mFuc = B;

IAsyncResult result = mFuc.BeginInvoke(3, null, null);
//等待执行完成
while (result.IsCompleted == false)
{
    Thread.Sleep(100);
}
//获取结果
int res = mFuc.EndInvoke(result);

Console.WriteLine(res);

结果

 

等待执行完成的方法除了用while循环判断

 

还有另一个方法

WaitOne

返回值为当前线程是否结束,其中1000为超时时间,如果等待1000ms,线程还没结束则返回false

Func<int, int> mFuc = B;

IAsyncResult result = mFuc.BeginInvoke(3, null, null);

//获取是否结束
bool isEnd =  result.AsyncWaitHandle.WaitOne(1000);//1000是超时时间

if (isEnd == true)
{
    //获取结果
    int res = mFuc.EndInvoke(result);
}

 

通过回调,返回结果

private void OnCallBack(IAsyncResult result)
{
    Func<int, int> func = result.AsyncState as Func<int, int>;
    int res = func.EndInvoke(result);
}

 

Func<int, int> mFuc = B;

IAsyncResult result = mFuc.BeginInvoke(3, OnCallBack, mFuc);

 

lambda表达式简化写法

Func<int, int> mFuc = B;

IAsyncResult result = mFuc.BeginInvoke(3, ar=> 
{
    int res = mFuc.EndInvoke(ar);
}, null);

 

Thread

无参

Thread thread = new Thread(() =>
{
    Console.WriteLine("启动线程:" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(2000);
    Console.WriteLine("线程结束");
});
thread.Start();

//获取线程ID
Console.WriteLine("Main:" + Thread.CurrentThread.ManagedThreadId);

结果

有参

通过Start方法传递参数,形参是一个object类型的

Thread thread = new Thread((ob) =>
{
    Console.WriteLine(ob.ToString() + "启动线程:" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(2000);
    Console.WriteLine("线程结束");
});
thread.Start("哈哈");

可以通过IsBackground设置为后台线程

 thread.IsBackground = true;

前台线程与后台线程的区别就是,进程会等待所有前台线程完成后结束,而不管后台线程,则进程中还存在着后台线程而没有前台线程,也直接结束

 

线程池

都是后台进程

ThreadPool.QueueUserWorkItem(Run,"哈哈");

 

Task

任务

开始任务的几种方法

一,task.Start()

private void Run()
{
    Console.WriteLine("启动任务:" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(2000);
    Console.WriteLine("任务结束");
}

 

Task task = new Task(Run);
task.Start();

二,Task.Factory.StartNew(Run)

Task.Factory.StartNew(Run);

 

连续任务

就是只有当一个任务完成后,才能执行下一个任务

private void Task1()
{
    Console.WriteLine("启动任务1:" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(2000);
    Console.WriteLine("任务结束");
}

private void Task2(Task task)
{
    Console.WriteLine("启动任务2:" + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(2000);
    Console.WriteLine("任务结束");
}

创建任务

Task task1 = new Task(Task1);
Task task2 = task1.ContinueWith(Task2);
Task task3 = task1.ContinueWith(Task2);

task1.Start();

当task1执行完成后,才会执行task2,task3

 

关于任务的等待

等待任务完成,在执行以下操作

private void Task1()
{
    Console.WriteLine("启动任务");
    Thread.Sleep(2000);
    Console.WriteLine("任务结束");
}

通过Wait()方法等待

public void Te()
{
    Task task = new Task(Task1);
    task.Start();
    task.Wait();

    Console.WriteLine("Main");
}

通过async/await

public async void Te()
{
    Task task = new Task(Task1);
    task.Start();
    await task;

    Console.WriteLine("Main");
}

注意在方法加关键字async

 

async/await

这两个关键字是.net 4.5的语法。如果是.net4.0的项目,可以通过安装async包

1.在项目右键

2.搜索async,下面这个,选择对应的项目安装即可

 

关于Task返回值的接收

private bool Task1()
{
    Console.WriteLine("启动任务");
    Thread.Sleep(2000);
    Console.WriteLine("任务结束");
    return true;
}

 

public async void Te()
{
    Task<bool> task = new Task<bool>(Task1);
    task.Start();

    bool res =  await task;
    bool res2 = task.Result;

    Console.WriteLine("Main");
}

可以通过bool res =  await task;来接收结果

也可以await task; bool res2 = task.Result;从Result得到返回值

 

任务的取消

CancellationTokenSource tokenSource;
tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
Task task = Task.Factory.StartNew(() =>
{
    while (true)
    {
        if(token.IsCancellationRequested == true) return;

        Console.WriteLine(DateTime.Now);
        Thread.Sleep(1000);
    }
}, token);

token.Register(() =>
{
    Console.WriteLine("取消");
});

取消

tokenSource.Cancel();

 

任务的暂停和继续

ManualResetEvent resetEvent;
resetEvent = new ManualResetEvent(false);//设置初始状态为暂停状态

Task.Factory.StartNew(() =>
{
    while (true)
    {
        resetEvent.WaitOne();

         Console.WriteLine("执行任务中");

        Thread.Sleep(1000);
    }
});

开始或继续

resetEvent.Set();

暂停

resetEvent.Reset();

 

相关推荐
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目的实战源码是我发布在 GitHub 上的开源项目 newbee-mall (新蜂商城),目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能的讲解,让大家实际操作并实践上手一个大型的线上商城项目,并学习到一定的开发经验以及其中的开发技巧。<br /> 商城项目所涉及的功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂的操作步骤,仅需 2 秒就可以启动这个完整的商城项目 </li> <li> 最终的实战项目是一个企业级别的 Spring Boot 大型项目,对于各个阶段的 Java 开发者都是极佳的选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目的页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页