1,学习地址---微软官网

2,目标:学习Razor,以及建立Web应用.

3,https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/?view=aspnetcore-3.0

4,概念学习:

异步编程模型 (TAP)'

相关网站

https://www.cnblogs.com/neverc/p/4653539.html

5, 异步线程执行的几个方式:

1,创建任务并且启动:

//方法1:
Task t = new Task(
() =>
{
Thread.Sleep(1000);
Console.WriteLine("Hello,World1\n");
});
t.Start();
//方法2:
await Task.Run(
() =>
{
Thread.Sleep(1000);
Console.WriteLine("Hello,World1\n");
});
//方法3:
Task<string> task2 =Task.Factory.StartNew<string>(() =>
{
return $"hello, task2的ID为{ Thread.CurrentThread.ManagedThreadId}";
});

2,aysnc 和 await的组合:

Thread.Sleep(1000);
             Console.WriteLine("Hello,World\n");
              await Task.Run<int>(
              () =>
              {
                  Thread.Sleep(1000);
                  Console.WriteLine("Hello,World1\n");
                  return 1;
              });
             Console.WriteLine("Hello,World2\n");
             return 1;

注意: 执行顺序     主函数---->调用aysnc函数并执行到await语句---------->回到主程序--->执行await之后的语句.

\                                                           /

\--执行 异步函数体-----------并且返回----/

3,任务的启动,取消,回调等...

任务等待:

Task的Wait/WaitAny/WaitAll方法
Task.WaitAll(new Task[]{ task1,task2});
Task.Factory.ContinueWhenAll(new Task[] { task1, task2 }, (t) =>
{
Thread.Sleep(100);
Console.WriteLine("执行后续操作");
});

4,任务取消CancellationTokenSource

namespace CancelAListOfTasks
{
public partial class MainWindow : Window
{
// Declare a System.Threading.CancellationTokenSource.
CancellationTokenSource cts; public MainWindow()
{
InitializeComponent();
} private async void startButton_Click(object sender, RoutedEventArgs e)
{
// Instantiate the CancellationTokenSource.
cts = new CancellationTokenSource(); resultsTextBox.Clear(); try
{
await AccessTheWebAsync(cts.Token);
// ***Small change in the display lines.
resultsTextBox.Text += "\r\nDownloads complete.";
}
catch (OperationCanceledException)
{
resultsTextBox.Text += "\r\nDownloads canceled.";
}
catch (Exception)
{
resultsTextBox.Text += "\r\nDownloads failed.";
} // Set the CancellationTokenSource to null when the download is complete.
cts = null;
} // Add an event handler for the Cancel button.
private void cancelButton_Click(object sender, RoutedEventArgs e)
{
if (cts != null)
{
cts.Cancel();
}
} // Provide a parameter for the CancellationToken.
// ***Change the return type to Task because the method has no return statement.
async Task AccessTheWebAsync(CancellationToken ct)
{
// Declare an HttpClient object.
HttpClient client = new HttpClient(); // ***Call SetUpURLList to make a list of web addresses.
List<string> urlList = SetUpURLList(); // ***Add a loop to process the list of web addresses.
foreach (var url in urlList)
{
// GetAsync returns a Task<HttpResponseMessage>.
// Argument ct carries the message if the Cancel button is chosen.
// ***Note that the Cancel button can cancel all remaining downloads.
HttpResponseMessage response = await client.GetAsync(url, ct); // Retrieve the website contents from the HttpResponseMessage.
byte[] urlContents = await response.Content.ReadAsByteArrayAsync(); resultsTextBox.Text +=
$"\r\nLength of the downloaded string: {urlContents.Length}.\r\n";
}
} // ***Add a method that creates a list of web addresses.
private List<string> SetUpURLList()
{
List<string> urls = new List<string>
{
"https://msdn.microsoft.com",
"https://msdn.microsoft.com/library/hh290138.aspx",
"https://msdn.microsoft.com/library/hh290140.aspx",
"https://msdn.microsoft.com/library/dd470362.aspx",
"https://msdn.microsoft.com/library/aa578028.aspx",
"https://msdn.microsoft.com/library/ms404677.aspx",
"https://msdn.microsoft.com/library/ff730837.aspx"
};
return urls;
}
}
static async void GetWebAsync1(CancellationToken ct)
{
try
{
await AccessTheWebAsync(ct); }
catch (OperationCanceledException)
{ }
catch (Exception)
{ } }
}

5 在一个任务完成后取消后续任务

static async Task  AccessTheWebAsync(CancellationTokenSource cts,CancellationToken ct)
{
HttpClient client = new HttpClient();
List<string> urlList = SetUpURLList();
IEnumerable<Task<int>> downloadTasksQuery =
from url in urlList select ProcessURLAsync(url, client, ct); // ***Use ToArray to execute the query and start the download tasks.
Task<int>[] downloadTasks = downloadTasksQuery.ToArray(); // ***Call WhenAny and then await the result. The task that finishes
// first is assigned to firstFinishedTask.
Task<int> firstFinishedTask = await Task.WhenAny(downloadTasks);

cts.Cancel();

            // websites can finish first.
var length = await firstFinishedTask;
Console.WriteLine($"\r\nLength of the downloaded website: {length}\r\n");
}

5.1 利用 Linq语法生成枚举类型,然后再触发异步事件群.

5.2 利用WhenAny,WhenAll等方法进行堵塞

static async Task  AccessTheWebAsync(CancellationTokenSource cts,CancellationToken ct)
{
HttpClient client = new HttpClient();
List<string> urlList = SetUpURLList();
IEnumerable<Task<int>> downloadTasksQuery =
from url in urlList select ProcessURLAsync(url, client, ct); // ***Use ToArray to execute the query and start the download tasks.
Task<int>[] downloadTasks = downloadTasksQuery.ToArray();
int[] first =await Task.WhenAll(downloadTasks);
foreach(var x in first) Console.WriteLine(x + "\r\n"); }
static async Task<int> ProcessURLAsync(string url, HttpClient client, CancellationToken ct)
{
// GetAsync returns a Task<HttpResponseMessage>.
HttpResponseMessage response = await client.GetAsync(url, ct); // Retrieve the website contents from the HttpResponseMessage.
byte[] urlContents = await response.Content.ReadAsByteArrayAsync();
Console.WriteLine("\r\n{urlContents}");
return urlContents.Length;
}

6,异步的防止再次进入函数的方法:

ASP.NET Learning Center---学习ASP.NET(1)的更多相关文章

  1. ASP.NET 开发者 开始学习ASP.NET Core 2吧

    .  NET Core 从2016年6月28日发布,过去了将近一年的时间,但是在工作中发现大家对.net core的接受程度并不高,这只是一个感觉,俗话说“没有调查就没有发言权”, 这两天通过微信小程 ...

  2. 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例

    在上一篇文章中,我们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 在本文章中,我们将使用“ ...

  3. 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面

    在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...

  4. 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序

    学习ASP.NET MVC系列: 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器 学习ASP ...

  5. 学习ASP.NET MVC(十一)——分页

    在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法.分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页.在今天这篇文章中,我们学习如果在MVC页面中使用PagedList. ...

  6. 学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!

    转自

  7. Asp.NET之对象学习

    一.总述 二.具体介绍 1.Request对象 Request对象是用来获取client在请求一个页面或传送一个Form时提供的全部信息,这包含可以标识浏览器和用户的HTTP变量,存储在client的 ...

  8. 学习ASP.NET Core,你必须了解无处不在的“依赖注入”

    ASP.NET Core的核心是通过一个Server和若干注册的Middleware构成的管道,不论是管道自身的构建,还是Server和Middleware自身的实现,以及构建在这个管道的应用,都需要 ...

  9. ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘

    开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行 ...

随机推荐

  1. maven项目pom.xml加载本地jar,自定义jar

    将jar放到resource目录下面: pom添加配置 <!-- 加载IK自定义 依赖--> <dependency> <groupId>com.ik.up< ...

  2. netty EventLoop线程与当前线程的问题

    模拟客户端向服务端发送消息: 客户端部分代码如下,当连接激活触发消息发送,采用线程池的形式,分多个线程向服务端发送同一消息 @Override public void channelActive(Ch ...

  3. CSS 故障艺术

    本文的主题是 Glitch Art,故障艺术. 什么是故障艺术?我们熟知的抖音的 LOGO 正是故障艺术其中一种表现形式.它有一种魔幻的感觉,看起来具有闪烁.震动的效果,很吸引人眼球. 故障艺术它模拟 ...

  4. kvm命令

    查询:virsh -c     qemu:///system list    查看当前的虚拟系统 brctl show     列出当前所有的网桥接口virsh list   列出运行的虚拟机virs ...

  5. 时序数据库 Apache-IoTDB 源码解析之文件格式简介(三)

    上一章聊到在车联网或物联网中对数据库的需求,以及 IoTDB 的整体架构,详情请见: 时序数据库 Apache-IoTDB 源码解析之系统架构(二) 打一波广告,欢迎大家访问IoTDB 仓库,求一波 ...

  6. C++读取MNIST数据集

    MNIST是一个标准的手写字符测试集. Mnist数据集对应四个文件: train-images-idx3-ubyte: training set images  train-labels-idx1- ...

  7. iomanip、cstring、string、sstream

    #include<iomanip>          控   制   符                             作           用                 ...

  8. Mongodb 3.2.8: 集群环境搭建

    简介 MongoDB是一种面向文档的数据库管理系统,由C++撰写而成,以此来解决应用程序开发社区中的大量现实问题.2007年10月,MongoDB由10gen团队所发展.2009年2月首度推出. ## ...

  9. one-hot编码(pytorch实现)

    n = 5 #类别数 indices = torch.randint(0, n, size=(15,15)) #生成数组元素0~5的二维数组(15*15) one_hot = torch.nn.fun ...

  10. [redis读书笔记] 第一部分 数据结构与对象 整数集合

    typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t c ...