1,学习地址---微软官网
2,目标:学习Razor,以及建立Web应用.
3,https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/?view=aspnetcore-3.0
4,概念学习:
相关网站
https://www.cnblogs.com/neverc/p/4653539.html
5, 异步线程执行的几个方式:
1,创建任务并且启动:
//方法1: Task t = new Task( () => { Thread.Sleep(1000); Console.WriteLine("Hello,World1 "); }); t.Start(); //方法2: await Task.Run( () => { Thread.Sleep(1000); Console.WriteLine("Hello,World1 "); });
//方法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
");
await Task.Run<int>(
() =>
{
Thread.Sleep(1000);
Console.WriteLine("Hello,World1
");
return 1;
});
Console.WriteLine("Hello,World2
");
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 += " Downloads complete."; } catch (OperationCanceledException) { resultsTextBox.Text += " Downloads canceled."; } catch (Exception) { resultsTextBox.Text += " Downloads 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 += $" Length of the downloaded string: {urlContents.Length}. "; } } // ***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) { } } }
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($" Length of the downloaded website: {length} "); }
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 + " "); } 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(" {urlContents}"); return urlContents.Length; }