mirror of
https://github.com/m-lamonaca/dev-notes.git
synced 2025-04-10 04:46:41 +00:00
4600 lines
No EOL
107 KiB
HTML
4600 lines
No EOL
107 KiB
HTML
|
||
<!doctype html>
|
||
<html lang="en" class="no-js">
|
||
<head>
|
||
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
|
||
|
||
<meta name="author" content="Marcello Lamonaca">
|
||
|
||
|
||
<link rel="canonical" href="http://m-lamonaca.github.io/dev-notes/languages/dotnet/csharp/async-programming.html">
|
||
|
||
|
||
<link rel="prev" href="reactive-extensions.html">
|
||
|
||
|
||
<link rel="next" href="unit-tests.html">
|
||
|
||
|
||
<link rel="icon" href="../../../assets/images/favicon.png">
|
||
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.34">
|
||
|
||
|
||
|
||
<title>Async Programming - Dev Notes</title>
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="../../../assets/stylesheets/main.35f28582.min.css">
|
||
|
||
|
||
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<script src="https://unpkg.com/iframe-worker/shim"></script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
|
||
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
|
||
|
||
|
||
|
||
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta property="og:type" content="website" >
|
||
|
||
<meta property="og:title" content="Async Programming - Dev Notes" >
|
||
|
||
<meta property="og:description" content="None" >
|
||
|
||
<meta property="og:image" content="http://m-lamonaca.github.io/dev-notes/assets/images/social/languages/dotnet/csharp/async-programming.png" >
|
||
|
||
<meta property="og:image:type" content="image/png" >
|
||
|
||
<meta property="og:image:width" content="1200" >
|
||
|
||
<meta property="og:image:height" content="630" >
|
||
|
||
<meta property="og:url" content="http://m-lamonaca.github.io/dev-notes/languages/dotnet/csharp/async-programming.html" >
|
||
|
||
<meta name="twitter:card" content="summary_large_image" >
|
||
|
||
<meta name="twitter:title" content="Async Programming - Dev Notes" >
|
||
|
||
<meta name="twitter:description" content="None" >
|
||
|
||
<meta name="twitter:image" content="http://m-lamonaca.github.io/dev-notes/assets/images/social/languages/dotnet/csharp/async-programming.png" >
|
||
|
||
|
||
|
||
</head>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="deep-orange">
|
||
|
||
|
||
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
||
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
||
<label class="md-overlay" for="__drawer"></label>
|
||
<div data-md-component="skip">
|
||
|
||
|
||
<a href="#async-programming" class="md-skip">
|
||
Skip to content
|
||
</a>
|
||
|
||
</div>
|
||
<div data-md-component="announce">
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
|
||
<nav class="md-header__inner md-grid" aria-label="Header">
|
||
<a href="../../../index.html" title="Dev Notes" class="md-header__button md-logo" aria-label="Dev Notes" data-md-component="logo">
|
||
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6m80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3l89.3 89.4-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3"/></svg>
|
||
|
||
</a>
|
||
<label class="md-header__button md-icon" for="__drawer">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
|
||
</label>
|
||
<div class="md-header__title" data-md-component="header-title">
|
||
<div class="md-header__ellipsis">
|
||
<div class="md-header__topic">
|
||
<span class="md-ellipsis">
|
||
Dev Notes
|
||
</span>
|
||
</div>
|
||
<div class="md-header__topic" data-md-component="header-topic">
|
||
<span class="md-ellipsis">
|
||
|
||
Async Programming
|
||
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<form class="md-header__option" data-md-component="palette">
|
||
|
||
|
||
|
||
|
||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="deep-orange" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
|
||
|
||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||
</label>
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="orange" data-md-color-accent="deep-orange" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
|
||
|
||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||
</label>
|
||
|
||
|
||
</form>
|
||
|
||
|
||
|
||
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
||
|
||
|
||
|
||
<label class="md-header__button md-icon" for="__search">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||
</label>
|
||
<div class="md-search" data-md-component="search" role="dialog">
|
||
<label class="md-search__overlay" for="__search"></label>
|
||
<div class="md-search__inner" role="search">
|
||
<form class="md-search__form" name="search">
|
||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||
<label class="md-search__icon md-icon" for="__search">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||
</label>
|
||
<nav class="md-search__options" aria-label="Search">
|
||
|
||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||
</button>
|
||
</nav>
|
||
|
||
</form>
|
||
<div class="md-search__output">
|
||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||
<div class="md-search-result" data-md-component="search-result">
|
||
<div class="md-search-result__meta">
|
||
Initializing search
|
||
</div>
|
||
<ol class="md-search-result__list" role="presentation"></ol>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<div class="md-header__source">
|
||
<a href="https://github.com/m-lamonaca/dev-notes" title="Go to repository" class="md-source" data-md-component="source">
|
||
<div class="md-source__icon md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
|
||
</div>
|
||
<div class="md-source__repository">
|
||
GitHub
|
||
</div>
|
||
</a>
|
||
</div>
|
||
|
||
</nav>
|
||
|
||
|
||
|
||
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
|
||
<div class="md-grid">
|
||
<ul class="md-tabs__list">
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../index.html" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
Home
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../containers/docker.html" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
Containers
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../databases/redis.html" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
Databases
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item md-tabs__item--active">
|
||
<a href="../../html/html.html" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
Languages
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../misc/git.html" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
Misc
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../linux/filesystem/file-links.html" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
Linux
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
|
||
|
||
</header>
|
||
|
||
<div class="md-container" data-md-component="container">
|
||
|
||
|
||
|
||
|
||
<main class="md-main" data-md-component="main">
|
||
<div class="md-main__inner md-grid">
|
||
|
||
|
||
|
||
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
||
<div class="md-sidebar__scrollwrap">
|
||
<div class="md-sidebar__inner">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
|
||
<label class="md-nav__title" for="__drawer">
|
||
<a href="../../../index.html" title="Dev Notes" class="md-nav__button md-logo" aria-label="Dev Notes" data-md-component="logo">
|
||
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6m80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3l89.3 89.4-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3"/></svg>
|
||
|
||
</a>
|
||
Dev Notes
|
||
</label>
|
||
|
||
<div class="md-nav__source">
|
||
<a href="https://github.com/m-lamonaca/dev-notes" title="Go to repository" class="md-source" data-md-component="source">
|
||
<div class="md-source__icon md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
|
||
</div>
|
||
<div class="md-source__repository">
|
||
GitHub
|
||
</div>
|
||
</a>
|
||
</div>
|
||
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../index.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Home
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Containers
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Containers
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../containers/docker.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Docker
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../containers/kubernetes.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Kubernetes
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Databases
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_3">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Databases
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../databases/redis.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Redis
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../databases/sql.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
SQL
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../databases/mongo-db.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
MongoDB
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Languages
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
|
||
<label class="md-nav__title" for="__nav_4">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Languages
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../html/html.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
HTML
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../markdown.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Markdown
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../css/css.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
CSS
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../c/c.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
C
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../kotlin/kotlin.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Kotlin
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../swift/swift.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Swift
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_7" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_7" id="__nav_4_7_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Assembly
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_7_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_7">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Assembly
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../assembly/intel.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Intel
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../assembly/riscv.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
RISC-V
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_8" id="__nav_4_8_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Python
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_8_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_8">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Python
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/python.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Python
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8_2" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_8_2" id="__nav_4_8_2_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Modules
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_2_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_8_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Modules
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/argparse.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
argparse
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/collections.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
collection
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/csv.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
csv
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/ftplib.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
ftplib
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/itertools.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
itertools
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/json.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
json
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/logging.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
logging
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/shutil.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
shutil
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/smtplib.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
smtplib
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/socket.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
socket
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/sqlite.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
sqlite
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/time-datetime.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
time & datetime
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/modules/unittest.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
unittest
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8_3" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_8_3" id="__nav_4_8_3_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Libraries
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_3_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_8_3">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Libraries
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/libs/tkinter.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
TKinter
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/libs/numpy.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Numpy
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/libs/pandas.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Pandas
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/libs/seaborn.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Seaborn
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/libs/requests.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Requests
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../python/libs/beautiful-soup.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Beatiful Soup
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9" checked>
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_9" id="__nav_4_9_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
.NET
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_9_label" aria-expanded="true">
|
||
<label class="md-nav__title" for="__nav_4_9">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
.NET
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_1" checked>
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_9_1" id="__nav_4_9_1_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
C#
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_1_label" aria-expanded="true">
|
||
<label class="md-nav__title" for="__nav_4_9_1">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
C#
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="csharp.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
C#
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="linq.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Linq
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="collections.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Collections
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="reactive-extensions.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Reactive Extensions
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--active">
|
||
|
||
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
||
|
||
|
||
|
||
|
||
|
||
<label class="md-nav__link md-nav__link--active" for="__toc">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Async Programming
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<a href="async-programming.html" class="md-nav__link md-nav__link--active">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Async Programming
|
||
</span>
|
||
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<label class="md-nav__title" for="__toc">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Table of contents
|
||
</label>
|
||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#task-asynchronous-programming-model-tap" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Task Asynchronous Programming Model (TAP)
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Task Asynchronous Programming Model (TAP)">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#threads" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Threads
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#naming-convention" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Naming Convention
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#async-return-types" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Async Return Types
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Async Return Types">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#task-return-type" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Task return type
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#tasktresult-return-type" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Task<TResult> return type
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#void-return-type" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
void return type
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#generalized-async-return-types-and-valuetasktresult" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Generalized async return types and ValueTask<TResult>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#async-composition" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Async Composition
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#execution-synchronization-context" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Execution & Synchronization Context
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#error-handling" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Error Handling
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Error Handling">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#argument-validation" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Argument Validation
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="unit-tests.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Unit Tests
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_2" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_9_2" id="__nav_4_9_2_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
ASP.NET
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_2_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_9_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
ASP.NET
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../asp.net/minimal-api.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Minimal API
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../asp.net/filters.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
FIlters
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../asp.net/middleware.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Middleware
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../asp.net/razor-syntax.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Razor Syntax
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../asp.net/blazor.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Blazor
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../asp.net/signalr.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
SignalR
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../asp.net/web-forms.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Web Forms
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_3" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_9_3" id="__nav_4_9_3_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Database
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_3_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_9_3">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Database
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../database/ado.net.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
ADO.NET
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../database/entity-framework.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Entity Framework
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_10" id="__nav_4_10_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Java
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_10_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_10">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Java
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../java/java.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Java
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../java/java-collection-framework.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Java Collection Framework
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../java/dao.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
DAO
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10_4" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_10_4" id="__nav_4_10_4_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Web
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_10_4_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_10_4">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Web
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../java/web/servlet.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Serverlet
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10_4_2" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_10_4_2" id="__nav_4_10_4_2_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Spring
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_4_10_4_2_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_10_4_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Spring
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../java/spring/pom.xml.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
POM
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../java/spring/spring-project.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Project Structure
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_11" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_11" id="__nav_4_11_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
PHP
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_11_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_11">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
PHP
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/php.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
PHP
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/database.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Database
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/web.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Web
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/dependency-injection.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Dependency Injection
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/unit-tests.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Unit Tests
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/composer.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Composer
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/psr-7.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
PSR 7
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/plates-templating.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Plates
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_11_9" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_11_9" id="__nav_4_11_9_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Simple MVC
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_11_9_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_11_9">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Simple MVC
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/simple-mvc/simple-mvc.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Simple MVC
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../php/simple-mvc/rest-api.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
REST API
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_12" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_12" id="__nav_4_12_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Rust
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_12_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_12">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Rust
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../rust/rust.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Rust
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../rust/macros.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Macros
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../rust/cargo.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Cargo
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../rust/concurrency.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Concurrency
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../rust/unit-tests.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Unit Tests
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_13" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_13" id="__nav_4_13_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Javascript
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_13_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_13">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Javascript
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/javascript.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Javascript
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/dom.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
DOM
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/events-animation.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Events & Animation
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/ajax.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
AJAX
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/jquery.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
jQuery
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_13_6" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_13_6" id="__nav_4_13_6_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
React
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_13_6_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_13_6">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
React
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/react/react.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
React
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/react/react-router.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
React Router
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/react/react-tests.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
React Tests
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/react/redux.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Redux
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/react/redux-tests.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Redux Tests
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../javascript/svelte/svelte.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Svelte
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_14" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_14" id="__nav_4_14_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
PowerShell
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_14_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_14">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
PowerShell
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../powershell/scripting.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Scripting
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../powershell/commands.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Commands
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_15" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_4_15" id="__nav_4_15_label" tabindex="">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Bash
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_15_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_4_15">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Bash
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../bash/scripting.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Scripting
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../bash/commands.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Commands
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Misc
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_5">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Misc
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../misc/git.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Git
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../misc/graph-ql.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
GraphQL
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../misc/regular-expressions.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
RegEx
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../misc/ssh.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
SSH
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../misc/web-components.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
WebComponents
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Linux
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_6">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Linux
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_1" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_6_1" id="__nav_6_1_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Filesystem
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_1_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_6_1">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Filesystem
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../linux/filesystem/file-links.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
File Links
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../linux/filesystem/procfs.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
/proc
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../linux/filesystem/sysfs.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
/sys
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" >
|
||
|
||
|
||
<label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="0">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
System Init
|
||
</span>
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_6_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
System Init
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../linux/init/systemd.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
Systemd
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../../linux/init/open-rc.html" class="md-nav__link">
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
OpenRC
|
||
</span>
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
||
<div class="md-sidebar__scrollwrap">
|
||
<div class="md-sidebar__inner">
|
||
|
||
|
||
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<label class="md-nav__title" for="__toc">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
Table of contents
|
||
</label>
|
||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#task-asynchronous-programming-model-tap" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Task Asynchronous Programming Model (TAP)
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Task Asynchronous Programming Model (TAP)">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#threads" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Threads
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#naming-convention" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Naming Convention
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#async-return-types" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Async Return Types
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Async Return Types">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#task-return-type" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Task return type
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#tasktresult-return-type" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Task<TResult> return type
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#void-return-type" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
void return type
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#generalized-async-return-types-and-valuetasktresult" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Generalized async return types and ValueTask<TResult>
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#async-composition" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Async Composition
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#execution-synchronization-context" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Execution & Synchronization Context
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#error-handling" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Error Handling
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Error Handling">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#argument-validation" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
Argument Validation
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="md-content" data-md-component="content">
|
||
<article class="md-content__inner md-typeset">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<h1 id="async-programming"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/">Async Programming</a></h1>
|
||
<h2 id="task-asynchronous-programming-model-tap">Task Asynchronous Programming Model (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model">TAP</a>)</h2>
|
||
<p>It's possible to avoid performance bottlenecks and enhance the overall responsiveness of an application by using asynchronous programming.<br />
|
||
However, traditional techniques for writing asynchronous applications can be complicated, making them difficult to write, debug, and maintain.</p>
|
||
<p>C# 5 introduced a simplified approach, <strong>async programming</strong>, that leverages asynchronous support in the .NET Runtime.<br />
|
||
The compiler does the difficult work that the developer used to do, and the application retains a logical structure that resembles synchronous code.</p>
|
||
<p>In performance-sensitive code, asynchronous APIs are useful, because instead of wasting resources by forcing a thread to sit and wait for I/O to complete, a thread can kick off the work and then do something else productive in the meantime.</p>
|
||
<p>The <code>async</code> and <code>await</code> keywords in C# are the heart of async programming.</p>
|
||
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1"> 1</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-2"> 2</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-3"> 3</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-4"> 4</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-5"> 5</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-6"> 6</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-7"> 7</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-8"> 8</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-9"> 9</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-10">10</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-11">11</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-12">12</a></span>
|
||
<span class="normal"><a href="#__codelineno-0-13">13</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="k">public</span><span class="w"> </span><span class="k">async</span><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="n">TResult</span><span class="o">></span><span class="w"> </span><span class="n">MethodAsync</span>
|
||
<a id="__codelineno-0-2" name="__codelineno-0-2"></a><span class="p">{</span>
|
||
<a id="__codelineno-0-3" name="__codelineno-0-3"></a><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="n">TResult</span><span class="o">></span><span class="w"> </span><span class="n">resultTask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="n">OtherMethodAsync</span><span class="p">();</span>
|
||
<a id="__codelineno-0-4" name="__codelineno-0-4"></a>
|
||
<a id="__codelineno-0-5" name="__codelineno-0-5"></a><span class="w"> </span><span class="n">DoIndependentWork</span><span class="p">();</span>
|
||
<a id="__codelineno-0-6" name="__codelineno-0-6"></a>
|
||
<a id="__codelineno-0-7" name="__codelineno-0-7"></a><span class="w"> </span><span class="n">TResult</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="n">resultTask</span><span class="p">;</span>
|
||
<a id="__codelineno-0-8" name="__codelineno-0-8"></a>
|
||
<a id="__codelineno-0-9" name="__codelineno-0-9"></a><span class="w"> </span><span class="c1">// if the is no work to be done before awaiting</span>
|
||
<a id="__codelineno-0-10" name="__codelineno-0-10"></a><span class="w"> </span><span class="n">TResult</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="n">OtherMethodAsync</span><span class="p">();</span>
|
||
<a id="__codelineno-0-11" name="__codelineno-0-11"></a>
|
||
<a id="__codelineno-0-12" name="__codelineno-0-12"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">result</span><span class="p">;</span>
|
||
<a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="p">}</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
<p>Characteristics of Async Methods:</p>
|
||
<ul>
|
||
<li>The method signature includes an <code>async</code> modifier.</li>
|
||
<li>The name of an async method, by convention, ends with an "Async" suffix.</li>
|
||
<li>The return type is one of the following types:</li>
|
||
<li><code>Task<TResult></code> if the method has a return statement in which the operand has type <code>TResult</code>.</li>
|
||
<li><code>Task</code> if the method has no return statement or has a return statement with no operand.</li>
|
||
<li><code>void</code> if it's an async event handler.</li>
|
||
<li>Any other type that has a <code>GetAwaiter</code> method (starting with C# 7.0).</li>
|
||
<li>Starting with C# 8.0, <code>IAsyncEnumerable<T></code>, for an async method that returns an async stream.</li>
|
||
</ul>
|
||
<p>The method usually includes at least one <code>await</code> expression, which marks a point where the method can't continue until the awaited asynchronous operation is complete.<br />
|
||
In the meantime, the method is suspended, and control returns to the method's caller.</p>
|
||
<h3 id="threads">Threads</h3>
|
||
<p>Async methods are intended to be non-blocking operations. An <code>await</code> expression in an async method doesn't block the current thread while the awaited task is running. Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.</p>
|
||
<p>The <code>async</code> and <code>await</code> keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active. It's possible to use <code>Task.Run</code> to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available.</p>
|
||
<p>The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. In particular, this approach is better than the <code>BackgroundWorker</code> class for I/O-bound operations because the code is simpler and there is no need to guard against race conditions.<br />
|
||
In combination with the <code>Task.Run</code> method, async programming is better than <code>BackgroundWorker</code> for CPU-bound operations because async programming separates the coordination details of running the code from the work that <code>Task.Run</code> transfers to the thread pool.</p>
|
||
<h3 id="naming-convention">Naming Convention</h3>
|
||
<p>By convention, methods that return commonly awaitable types (for example, <code>Task</code>, <code>Task<T></code>, <code>ValueTask</code>, <code>ValueTask<T></code>) should have names that end with <em>Async</em>. Methods that start an asynchronous operation but do not return an awaitable type should not have names that end with <em>Async</em>, but may start with "Begin", "Start", or some other verb to suggest this method does not return or throw the result of the operation.</p>
|
||
<h2 id="async-return-types"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/async-return-types">Async Return Types</a></h2>
|
||
<h3 id="task-return-type"><code>Task</code> return type</h3>
|
||
<p>Async methods that don't contain a return statement or that contain a return statement that doesn't return an operand usually have a return type of <code>Task</code>. Such methods return <code>void</code> if they run synchronously.<br />
|
||
If a <code>Task</code> return type is used for an async method, a calling method can use an <code>await</code> operator to suspend the caller's completion until the called async method has finished.</p>
|
||
<h3 id="tasktresult-return-type"><code>Task<TResult></code> return type</h3>
|
||
<p>The <code>Task<TResult></code> return type is used for an async method that contains a return statement in which the operand is <code>TResult</code>.</p>
|
||
<p>The <code>Task<TResult>.Result</code> property is a <strong>blocking property</strong>. If it's accessed it before its task is finished, the thread that's currently active is blocked until the task completes and the value is available.<br />
|
||
In most cases, access the value by using <code>await</code> instead of accessing the property directly.</p>
|
||
<h3 id="void-return-type"><code>void</code> return type</h3>
|
||
<p>The <code>void</code> return type is used in asynchronous event handlers, which require a <code>void</code> return type. For methods other than event handlers that don't return a value, it's best to return a <code>Task</code> instead, because an async method that returns <code>void</code> can't be awaited.<br />
|
||
Any caller of such a method must continue to completion without waiting for the called async method to finish. The caller must be independent of any values or exceptions that the async method generates.</p>
|
||
<p>The caller of a void-returning async method <em>can't catch exceptions thrown from the method</em>, and such unhandled exceptions are likely to cause the application to fail.<br />
|
||
If a method that returns a <code>Task</code> or <code>Task<TResult></code> throws an exception, the exception is stored in the returned task. The exception is re-thrown when the task is awaited.<br />
|
||
Therefore, make sure that any async method that can produce an exception has a return type of <code>Task</code> or <code>Task<TResult></code> and that calls to the method are awaited.</p>
|
||
<h3 id="generalized-async-return-types-and-valuetasktresult">Generalized async return types and <code>ValueTask<TResult></code></h3>
|
||
<p>Starting with C# 7.0, an async method can return any type that has an accessible <code>GetAwaiter</code> method.</p>
|
||
<p>Because <code>Task</code> and <code>Task<TResult></code> are <strong>reference types</strong>, memory allocation in performance-critical paths, particularly when allocations occur in tight loops, can adversely affect performance. Support for generalized return types means that it's possible to return a lightweight <strong>value type</strong> instead of a reference type to avoid additional memory allocations.</p>
|
||
<p>.NET provides the <code>System.Threading.Tasks.ValueTask<TResult></code> structure as a lightweight implementation of a generalized task-returning value. To use the <code>System.Threading.Tasks.ValueTask<TResult></code> type, add the <strong>System.Threading.Tasks.Extensions</strong> NuGet package to the project.</p>
|
||
<h3 id="async-composition">Async Composition</h3>
|
||
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-1-1"> 1</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-2"> 2</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-3"> 3</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-4"> 4</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-5"> 5</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-6"> 6</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-7"> 7</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-8"> 8</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-9"> 9</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-10">10</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-11">11</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-12">12</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-13">13</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-14">14</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-15">15</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-16">16</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-17">17</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-18">18</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-19">19</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-20">20</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-21">21</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-22">22</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-23">23</a></span>
|
||
<span class="normal"><a href="#__codelineno-1-24">24</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1"></a><span class="k">public</span><span class="w"> </span><span class="k">async</span><span class="w"> </span><span class="n">Task</span><span class="w"> </span><span class="nf">DoOperationsConcurrentlyAsync</span><span class="p">()</span>
|
||
<a id="__codelineno-1-2" name="__codelineno-1-2"></a><span class="p">{</span>
|
||
<a id="__codelineno-1-3" name="__codelineno-1-3"></a><span class="w"> </span><span class="n">Task</span><span class="p">[]</span><span class="w"> </span><span class="n">tasks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Task</span><span class="p">[</span><span class="m">3</span><span class="p">];</span>
|
||
<a id="__codelineno-1-4" name="__codelineno-1-4"></a><span class="w"> </span><span class="n">tasks</span><span class="p">[</span><span class="m">0</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DoOperation0Async</span><span class="p">();</span>
|
||
<a id="__codelineno-1-5" name="__codelineno-1-5"></a><span class="w"> </span><span class="n">tasks</span><span class="p">[</span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DoOperation1Async</span><span class="p">();</span>
|
||
<a id="__codelineno-1-6" name="__codelineno-1-6"></a><span class="w"> </span><span class="n">tasks</span><span class="p">[</span><span class="m">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DoOperation2Async</span><span class="p">();</span>
|
||
<a id="__codelineno-1-7" name="__codelineno-1-7"></a>
|
||
<a id="__codelineno-1-8" name="__codelineno-1-8"></a><span class="w"> </span><span class="c1">// At this point, all three tasks are running at the same time.</span>
|
||
<a id="__codelineno-1-9" name="__codelineno-1-9"></a>
|
||
<a id="__codelineno-1-10" name="__codelineno-1-10"></a><span class="w"> </span><span class="c1">// Now, we await them all.</span>
|
||
<a id="__codelineno-1-11" name="__codelineno-1-11"></a><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="n">Task</span><span class="p">.</span><span class="n">WhenAll</span><span class="p">(</span><span class="n">tasks</span><span class="p">);</span>
|
||
<a id="__codelineno-1-12" name="__codelineno-1-12"></a><span class="p">}</span>
|
||
<a id="__codelineno-1-13" name="__codelineno-1-13"></a>
|
||
<a id="__codelineno-1-14" name="__codelineno-1-14"></a><span class="k">public</span><span class="w"> </span><span class="k">async</span><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">GetFirstToRespondAsync</span><span class="p">()</span>
|
||
<a id="__codelineno-1-15" name="__codelineno-1-15"></a><span class="p">{</span>
|
||
<a id="__codelineno-1-16" name="__codelineno-1-16"></a><span class="w"> </span><span class="c1">// Call two web services; take the first response.</span>
|
||
<a id="__codelineno-1-17" name="__codelineno-1-17"></a><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">[]</span><span class="w"> </span><span class="n">tasks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="p">[]</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">WebService1Async</span><span class="p">(),</span><span class="w"> </span><span class="n">WebService2Async</span><span class="p">()</span><span class="w"> </span><span class="p">};</span>
|
||
<a id="__codelineno-1-18" name="__codelineno-1-18"></a>
|
||
<a id="__codelineno-1-19" name="__codelineno-1-19"></a><span class="w"> </span><span class="c1">// Await for the first one to respond.</span>
|
||
<a id="__codelineno-1-20" name="__codelineno-1-20"></a><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">firstTask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="n">Task</span><span class="p">.</span><span class="n">WhenAny</span><span class="p">(</span><span class="n">tasks</span><span class="p">);</span>
|
||
<a id="__codelineno-1-21" name="__codelineno-1-21"></a>
|
||
<a id="__codelineno-1-22" name="__codelineno-1-22"></a><span class="w"> </span><span class="c1">// Return the result.</span>
|
||
<a id="__codelineno-1-23" name="__codelineno-1-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="n">firstTask</span><span class="p">;</span>
|
||
<a id="__codelineno-1-24" name="__codelineno-1-24"></a><span class="p">}</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
<h3 id="execution-synchronization-context">Execution & Synchronization Context</h3>
|
||
<p>When the program’s execution reaches an <code>await</code> expression for an operation that doesn’t complete immediately, the code generated for that <code>await</code> will ensure that the
|
||
current execution context has been captured.<br />
|
||
When the asynchronous operation completes, the remainder of the method will be executed through the execution context.
|
||
The execution context handles certain contextual information that needs to flow when one method invokes another (even when it does so indirectly)</p>
|
||
<p>While all <code>await</code> expressions capture the <em>execution context</em>, the decision of whether to flow <em>synchronization context</em> as well is controlled by the type being awaited.</p>
|
||
<p>Sometimes, it's better to avoid getting the synchronization context involved.<br />
|
||
If work starting from a UI thread is performed, but there is no particular need to remain on that thread, scheduling every continuation through the synchronization context is unnecessary overhead.</p>
|
||
<p>If the asynchronous operation is a <code>Task</code>, <code>Task<T></code>, <code>ValueTask</code> or <code>ValueTask<T></code>, it's possible to discard the <em>synchronization context</em> by calling the <code>ConfigureAwait(false)</code>.<br />
|
||
This returns a different representation of the asynchronous operation, and if this iss awaited that instead of the original task, it will ignore the current <code>SynchronizationContext</code> if there is one.</p>
|
||
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-2-1">1</a></span>
|
||
<span class="normal"><a href="#__codelineno-2-2">2</a></span>
|
||
<span class="normal"><a href="#__codelineno-2-3">3</a></span>
|
||
<span class="normal"><a href="#__codelineno-2-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="k">private</span><span class="w"> </span><span class="k">async</span><span class="w"> </span><span class="n">Task</span><span class="w"> </span><span class="nf">DownloadFileAsync</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">fileName</span><span class="p">)</span>
|
||
<a id="__codelineno-2-2" name="__codelineno-2-2"></a><span class="p">{</span>
|
||
<a id="__codelineno-2-3" name="__codelineno-2-3"></a><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nf">OperationAsync</span><span class="p">(</span><span class="n">fileName</span><span class="p">).</span><span class="n">ConfigureAwait</span><span class="p">(</span><span class="k">false</span><span class="p">);</span><span class="w"> </span><span class="c1">// discarding original context</span>
|
||
<a id="__codelineno-2-4" name="__codelineno-2-4"></a><span class="p">}</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
<p>When writing libraries in most cases you it'ss best to call <code>ConfigureAwait(false)</code> anywhere <code>await</code> is used.<br />
|
||
This is because continuing via the synchronization context can be expensive, and in some cases it can introduce the possibility of deadlock occurring.</p>
|
||
<p>The only exceptions are when are doing something that positively requires the synchronization context to be preserved, or it's know for certain that the library will only ever be used in
|
||
application frameworks that do not set up a synchronization context.<br />
|
||
(ASP.NET Core applications do not use synchronization contexts, so it generally doesn’t matter whether or not <code>ConfigureAwait(false)</code> is called in those)</p>
|
||
<h2 id="error-handling">Error Handling</h2>
|
||
<h3 id="argument-validation">Argument Validation</h3>
|
||
<p>Inside an <code>async</code> method, the compiler treats all exceptions in the same way: none are allowed to pass up the stack as in a normal method, and they will always be reported by faulting the returned task.<br />
|
||
This is true even of exceptions thrown before the first <code>await</code>.</p>
|
||
<p>If the calling method immediately calls <code>await</code> on the return task, this won’t matter much—it will see the exception in any case.<br />
|
||
But some code may choose not to wait immediately, in which case it won’t see the argument exception until later.</p>
|
||
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-3-1"> 1</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-2"> 2</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-3"> 3</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-4"> 4</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-5"> 5</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-6"> 6</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-7"> 7</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-8"> 8</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-9"> 9</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-10">10</a></span>
|
||
<span class="normal"><a href="#__codelineno-3-11">11</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1"></a><span class="k">async</span><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="kt">string</span><span class="o">></span><span class="w"> </span><span class="n">MethodWithValidationAsync</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">argument</span><span class="p">)</span>
|
||
<a id="__codelineno-3-2" name="__codelineno-3-2"></a><span class="p">{</span>
|
||
<a id="__codelineno-3-3" name="__codelineno-3-3"></a><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">sting</span><span class="p">.</span><span class="n">IsNullOrEmpty</span><span class="p">(</span><span class="n">argument</span><span class="p">))</span>
|
||
<a id="__codelineno-3-4" name="__codelineno-3-4"></a><span class="w"> </span><span class="p">{</span>
|
||
<a id="__codelineno-3-5" name="__codelineno-3-5"></a><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ArgumentNullException</span><span class="p">(</span><span class="n">nameof</span><span class="p">(</span><span class="n">argument</span><span class="p">));</span><span class="w"> </span><span class="c1">// will be thrown on await of MethodWithValidationAsync</span>
|
||
<a id="__codelineno-3-6" name="__codelineno-3-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a id="__codelineno-3-7" name="__codelineno-3-7"></a>
|
||
<a id="__codelineno-3-8" name="__codelineno-3-8"></a><span class="w"> </span><span class="c1">// [...]</span>
|
||
<a id="__codelineno-3-9" name="__codelineno-3-9"></a>
|
||
<a id="__codelineno-3-10" name="__codelineno-3-10"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nf">LongOperationAsync</span><span class="p">();</span>
|
||
<a id="__codelineno-3-11" name="__codelineno-3-11"></a><span class="p">}</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
<p>In cases where you want to throw this kind of exception straightaway, the usual technique is to write a normal method that validates the arguments before calling an async method that does the
|
||
work, and to make that second method either private or local.</p>
|
||
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-4-1"> 1</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-2"> 2</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-3"> 3</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-4"> 4</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-5"> 5</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-6"> 6</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-7"> 7</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-8"> 8</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-9"> 9</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-10">10</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-11">11</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-12">12</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-13">13</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-14">14</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-15">15</a></span>
|
||
<span class="normal"><a href="#__codelineno-4-16">16</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1"></a><span class="c1">// not marked with async, exception propagate directly to caller</span>
|
||
<a id="__codelineno-4-2" name="__codelineno-4-2"></a><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="kt">string</span><span class="o">></span><span class="w"> </span><span class="n">MethodWithValidationAsync</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">argument</span><span class="p">)</span>
|
||
<a id="__codelineno-4-3" name="__codelineno-4-3"></a><span class="p">{</span>
|
||
<a id="__codelineno-4-4" name="__codelineno-4-4"></a><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">sting</span><span class="p">.</span><span class="n">IsNullOrEmpty</span><span class="p">(</span><span class="n">argument</span><span class="p">))</span>
|
||
<a id="__codelineno-4-5" name="__codelineno-4-5"></a><span class="w"> </span><span class="p">{</span>
|
||
<a id="__codelineno-4-6" name="__codelineno-4-6"></a><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ArgumentNullException</span><span class="p">(</span><span class="n">nameof</span><span class="p">(</span><span class="n">argument</span><span class="p">));</span><span class="w"> </span><span class="c1">// thrown immediately</span>
|
||
<a id="__codelineno-4-7" name="__codelineno-4-7"></a><span class="w"> </span><span class="p">}</span>
|
||
<a id="__codelineno-4-8" name="__codelineno-4-8"></a>
|
||
<a id="__codelineno-4-9" name="__codelineno-4-9"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nf">ActualMethodAsync</span><span class="p">(</span><span class="n">argument</span><span class="p">);</span><span class="w"> </span><span class="c1">// pass up task of inner method</span>
|
||
<a id="__codelineno-4-10" name="__codelineno-4-10"></a><span class="p">}</span>
|
||
<a id="__codelineno-4-11" name="__codelineno-4-11"></a>
|
||
<a id="__codelineno-4-12" name="__codelineno-4-12"></a><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">async</span><span class="w"> </span><span class="n">Task</span><span class="o"><</span><span class="kt">string</span><span class="o">></span><span class="w"> </span><span class="n">ActualMethodAsync</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">argument</span><span class="p">)</span>
|
||
<a id="__codelineno-4-13" name="__codelineno-4-13"></a><span class="p">{</span>
|
||
<a id="__codelineno-4-14" name="__codelineno-4-14"></a><span class="w"> </span><span class="c1">// [...]</span>
|
||
<a id="__codelineno-4-15" name="__codelineno-4-15"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nf">LongOperationAsync</span><span class="p">();</span>
|
||
<a id="__codelineno-4-16" name="__codelineno-4-16"></a><span class="p">}</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
<blockquote>
|
||
<p><strong>Note</strong>: <code>await</code> extracts only the first exception of an <code>AggregateException</code>, this can cause the loss of information if a task (or group of tasks) has more than one error.</p>
|
||
</blockquote>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</article>
|
||
</div>
|
||
|
||
|
||
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||
</div>
|
||
|
||
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
|
||
Back to top
|
||
</button>
|
||
|
||
</main>
|
||
|
||
<footer class="md-footer">
|
||
|
||
|
||
|
||
<nav class="md-footer__inner md-grid" aria-label="Footer" >
|
||
|
||
|
||
<a href="reactive-extensions.html" class="md-footer__link md-footer__link--prev" aria-label="Previous: Reactive Extensions">
|
||
<div class="md-footer__button md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||
</div>
|
||
<div class="md-footer__title">
|
||
<span class="md-footer__direction">
|
||
Previous
|
||
</span>
|
||
<div class="md-ellipsis">
|
||
Reactive Extensions
|
||
</div>
|
||
</div>
|
||
</a>
|
||
|
||
|
||
|
||
<a href="unit-tests.html" class="md-footer__link md-footer__link--next" aria-label="Next: Unit Tests">
|
||
<div class="md-footer__title">
|
||
<span class="md-footer__direction">
|
||
Next
|
||
</span>
|
||
<div class="md-ellipsis">
|
||
Unit Tests
|
||
</div>
|
||
</div>
|
||
<div class="md-footer__button md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
|
||
</div>
|
||
</a>
|
||
|
||
</nav>
|
||
|
||
|
||
<div class="md-footer-meta md-typeset">
|
||
<div class="md-footer-meta__inner md-grid">
|
||
<div class="md-copyright">
|
||
|
||
<div class="md-copyright__highlight">
|
||
MIT
|
||
</div>
|
||
|
||
|
||
Made with
|
||
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
||
Material for MkDocs
|
||
</a>
|
||
|
||
</div>
|
||
|
||
<div class="md-social">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a href="https://hachyderm.io/@m_lamonaca" target="_blank" rel="noopener me" title="hachyderm.io" class="md-social__link">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.5 102.5 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5m-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"/></svg>
|
||
</a>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a href="https://github.com/m-lamonaca" target="_blank" rel="noopener" title="github.com" class="md-social__link">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
||
</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
</div>
|
||
<div class="md-dialog" data-md-component="dialog">
|
||
<div class="md-dialog__inner md-typeset"></div>
|
||
</div>
|
||
|
||
|
||
<script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.indexes", "navigation.tracking", "navigation.pruning", "navigation.sections", "navigation.top", "navigation.tabs", "navigation.tabs.sticky", "navigation.footer", "toc.follow", "content.code.copy"], "search": "../../../assets/javascripts/workers/search.07f07601.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
|
||
|
||
|
||
<script src="../../../assets/javascripts/bundle.56dfad97.min.js"></script>
|
||
|
||
|
||
</body>
|
||
</html> |