栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C#笔记之任务

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#笔记之任务

Task

Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。

1、 创建一个task也有3种方式来操作,Task.Factory.StartNew()、Task run()、new Task(), 前面2种是一样的,不需要用start来开始执行,后面一种需要start来执行的。

Task t = Task.Run(() =>
{
Console.WriteLine(“执行异步方法”);
}

Task t = Task.Factory.StartNew( () => {
Console.WriteLine(“执行异步方法”);
} );

var task1 = new Task(() =>
{
Console.WriteLine(“Task 1 Begin”);
System.Threading.Thread.Sleep(2000);
Console.WriteLine(“Task 1 Finish”);
});
task1.Start();

2、取消任务的话,需要一个CancellationTokenSource的token来取消即可

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = Task.Factory.StartNew(() =>
{
for (var i = 0; i < 1000; i++)
{
System.Threading.Thread.Sleep(1000);
if (token.IsCancellationRequested)
{
Console.WriteLine(“Abort mission success!”);
return;
}
}
}, token);
tokenSource.Cancel();

3、WPF程序员处理多线程的一个方式 - Dispatcher
当我们打开一个WPF应用程序即开启了一个进程,该进程中至少包含两个线程。
一个线程Thread1用于处理呈现:隐藏在后台运行
一个线程Thread2用于管理用户界面:接收输入、处理事件、绘制屏幕以及运行应用程序代码。即UI线程
Task t = Task.Run(() =>
{

this.Dispatcher.Invoke(()=>
{
//当前lamda表达式为线程Thread2,用于管理用户界面
}
//下面执行的内容为线程Thread1,隐藏在后台运行
Console.WriteLine(“执行异步方法”);
}

4 、async/await是C#5.0中推出的
async用来修饰方法,表明这个方法是异步的,声明的方法的返回类型必须为:void,Task或Task。

await必须用来修饰Task或Task,而且只能出现在已经用async关键字修饰的异步方法中。通常情况下,async/await成对出现才有意义
static async Task GetStrLengthAsync()
{
Console.WriteLine(“GetStrLengthAsync方法开始执行”);
//此处返回的中的字符串类型,而不是Task
string str = await Task.Run(() =>
{
return “执行异步方法”;
};
Console.WriteLine(“Async方法执行结束”);
return str.Length;
}
await可以让主线程等待后台线程执行完毕再执行下一步;没有await,主线程不会等待后台线程执行完毕
如果只开了一个task,默认只有两个线程(主线程和Task开启的线程)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/910618.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号