- QueueBackgroundWorkItem to reliably schedule and run long background processes in ASP.NET
- Fire and Forget on ASP.NET
- Using QueueBackgroundWorkItem to Schedule Background Jobs from an ASP.NET Application in .NET 4.5.2
- Exploring QueueBackgroundWorkItem in ASP.NET and Framework 4.5.2
- An update on background tasks in ASP.NET
task ها در سی شارپ
استفاده از XQuery - قسمت دوم
کوئری گرفتن از اسناد XML دارای فضای نام، توسط XQuery
در مثال زیر، تمام المانهای سند XML، در فضای نام http://www.people.com تعریف شدهاند.
DECLARE @doc XML SET @doc =' <p:people xmlns:p="http://www.people.com"> <p:person name="Vahid" /> <p:person name="Farid" /> </p:people> ' SELECT @doc.query('/people/person')
سعی دوم احتمالا روش ذیل خواهد بود
SELECT @doc.query('/p:people/p:person')
XQuery [query()]: The name "p" does not denote a namespace.
SELECT @doc.query(' declare default element namespace "http://www.people.com"; /people/person ')
SELECT @doc.query(' declare namespace aa="http://www.people.com"; /aa:people/aa:person ')
روش دیگر تعریف فضای نام، استفاده از WITH XMLNAMESPACES، پیش از تعریف کوئری است:
WITH XMLNAMESPACES(DEFAULT 'http://www.people.com') SELECT @doc.query('/people/person')
در اینجا نیز امکان کار با چندین فضای نام وجود دارد و برای این منظور تنها کافی است از تعریف Alias استفاده شود. فضاهای نام بعدی با یک کاما از هم مجزا خواهند شد.
WITH XMLNAMESPACES('http://www.people.com' AS aa) SELECT @doc.query('/aa:people/aa:person')
عبارات XPath و FLOWR
XQuery از دو نوع عبارت XPath و FLOWR میتواند استفاده کند. XQuery همیشه از XPath برای انتخاب دادهها و نودها استفاده میکند. در اینجا هر نوع XPath سازگار با استاندارد 2 آن، یک XQuery نیز خواهد بود. برای انجام اعمالی بجز انتخاب دادهها، باید از عبارات FLOWR استفاده کرد؛ برای مثال برای ایجاد حلقه، مرتب سازی و یا ایجاد نودهای جدید.
در مثال زیر که data آن در قسمت قبل تعریف شد، دو کوئری نوشته شده یکی هستند:
SELECT @data.query(' (: FLOWE :) for $p in /people/person where $p/age > 30 return $p ') SELECT @data.query(' (: XPath :) /people/person[age>30] ')
XPath بسیار شبیه به مسیر دهیهای یونیکسی است. بسیار فشرده بوده و همچنین مناسب است برای کار با ساختارهای تو در تو و سلسله مراتبی. مثال زیر را درنظر بگیرید:
/books/book[1]/title/chapter
در XPath توسط قابلیتی به نام محور میتوان به المانهای قبلی یا بعدی دسترسی پیدا کرد. این محورهای پشتیبانی شده در SQL Server عبارتند از self (خود نود)، child (فرزند نود)، parent (والد نود)، decedent (فرزند فرزند فرزند ...)و attribute (دسترسی به ویژگیها). محورهای استانداردی مانند preceding-sibling و following-sibling در SQL Server با عملگرهایی مانند >> و << پشتیبانی میشوند.
مثالهایی از نحوهی استفاده از محورهای XPath
اینبار قصد داریم یک سند XML نسبتا پیچیده را بررسی کرده و اجزای مختلف آنرا به کمک XPath بدست بیاوریم.
DECLARE @doc XML SET @doc=' <Team name="Project 1" xmlns:a="urn:annotations"> <Employee id="544" years="6.5"> <Name>User 1</Name> <Title>Architect</Title> <Expertise>Games</Expertise> <Expertise>Puzzles</Expertise> <Employee id="101" years="7.1" a:assigned-to="C1"> <Name>User 2</Name> <Title>Dev lead</Title> <Expertise>Video Games</Expertise> <Employee id="50" years="2.3" a:assigned-to="C2"> <Name>User 3</Name> <Title>Developer</Title> <Expertise>Hardware</Expertise> <Expertise>Entertainment</Expertise> </Employee> </Employee> </Employee> </Team> '
در XPath، محور پیش فرض، child است (اگر مانند کوئری زیر مورد خاصی ذکر نشود):
SELECT @doc.query('/Team/Employee/Name')
SELECT @doc.query('/Team/Employee/child::Name')
<Name>User 1</Name>
SELECT @doc.query('//Employee/Name')
<Name>User 1</Name> <Name>User 2</Name> <Name>User 3</Name>
برای کار با ویژگیها و attributes از [] به همراه علامت @ استفاده میشود:
SELECT @doc.query(' declare namespace a = "urn:annotations"; //Employee[@a:assigned-to]/Name ')
<Name>User 2</Name> <Name>User 3</Name>
SELECT @doc.query(' declare namespace a = "urn:annotations"; //Employee[attribute::a:assigned-to]/Name ')
SELECT @doc.query(' declare namespace a = "urn:annotations"; //Employee[not(@a:assigned-to)]/Name ')
<Name>User 1</Name>
SELECT @doc.query('count(//Employee[Name="User 1"]/Employee)')
در XPath برای یافتن والد از .. استفاده میشود:
SELECT @doc.query('//Employee[../Name="User 1"]')
استفاده از .. در SQL Server به دلایل کارآیی پایین توصیه نمیشود. بهتر است از همان روش قبلی کوئری تعداد کارمندانی که به user 1 مستقیما گزارش میدهند، استفاده شود.
عبارات FLOWR
FLOWR هستهی XQuery را تشکیل داده و قابلیت توسعه XPath را دارد. FLOWR مخفف for، let، order by، where و retrun است. از for برای تشکیل حلقه، از let برای انتساب، از where و order by برای فیلتر و مرتب سازی اطلاعات و از return برای بازگشت نتایج کمک گرفته میشود. FLOWR بسیار شبیه به ساختار SQL عمل میکند.
معادل عبارت SQL
Select p.name, p.job from people as p where p.age > 30 order by p.age
for $p in /people/person where $p.age > 30 order by $p.age[1] return ($p/name, $p/job)
تنها تفاوت مهم، در اینجا است که در عبارات SQL، خروجی کار توسط select، در ابتدای کوئری ذکر میشود، اما در عبارات FLOWR در انتهای آنها.
از let برای انتساب مجموعهای از نودها استفاده میشود:
let $p := /people/person return $p
یک نکته
اگر به order by دقت کنید، به اولین سن اشاره میکند. Order by در اینجا با تک مقدارها کار میکند و امکان کار با مجموعهای از نودها را ندارد. به همین جهت باید طوری آنرا تنظیم کرد که هربار فقط به یک مقدار اشاره کند.
هر زمانیکه به خطای requires a singleton برخوردید، یعنی دستورات مورد استفاده با یک سری از نودها کار نکرده و نیاز است دقیقا مشخص کنید، کدام مقدار مدنظر است.
مثالهایی از عبارات FLOWR
دو کوئری ذیل یک خروجی 1 2 3 را تولید میکنند
DECLARE @x XML = ''; SELECT @x.query(' for $i in (1,2,3) return $i '); SELECT @x.query(' let $i := (1,2,3) return $i ');
در ادامه اگر سعی کنیم به این کوئریها یک order by را اضافه کنیم، کوئری اول با موفقیت اجرا شده،
DECLARE @x XML = ''; SELECT @x.query(' for $i in (1,2,3) order by $i descending return $i '); SELECT @x.query(' let $i := (1,2,3) order by $i descending return $i ');
XQuery [query()]: 'order by' requires a singleton (or empty sequence), found operand of type 'xs:integer +'
ساخت المانهای جدید XML توسط عبارات FLOWR
ابتدا همان سند XML قسمت قبل را درنظر بگیرید:
DECLARE @doc XML =' <people> <person> <name> <givenName>name1</givenName> <familyName>lname1</familyName> </name> <age>33</age> <height>short</height> </person> <person> <name> <givenName>name2</givenName> <familyName>lname2</familyName> </name> <age>40</age> <height>short</height> </person> <person> <name> <givenName>name3</givenName> <familyName>lname3</familyName> </name> <age>30</age> <height>medium</height> </person> </people> '
SELECT @doc.query(' for $p in /people/person return <person> {$p/name[1]/givenName[1]/text()} </person> ');
<person>name1</person> <person>name2</person> <person>name3</person>
سؤال: اگر به این خروجی بخواهیم یک root element اضافه کنیم، چه باید کرد؟ اگر المان root دلخواهی را در return قرار دهیم، به ازای هر آیتم یافت شده، یکبار تکرار میشود که مدنظر ما نیست.
SELECT @doc.query(' <root> { for $p in /people/person return <person> {$p/name[1]/givenName[1]/text()} </person> } </root> ');
<root> <person>name1</person> <person>name2</person> <person>name3</person> </root>
مفهوم quantification در FLOWR
همان سند Team name=Project 1 ابتدای بحث جاری را درنظر بگیرید.
SELECT @doc.query('some $emp in //Employee satisfies $emp/@years >5') -- true SELECT @doc.query('every $emp in //Employee satisfies $emp/@years >5') -- false
چطور کارهامون رو به صورت Async انجام بدیم با استفاده از Channel و HostedService
I hope you are satisfied with this tutorial. In these two articles, we tried to tell you the ways in which we can do things with maximum efficiency in full Async, without worrying about the completion of the Request and the Disposal of our service. These have always been among the concerns of various programmers. And always using inefficient methods such as not leaving the word await
There's two ways to deploy a .NET Core application. There's FDD and SCD. Since TLAs (three letter acronyms) are stupid, that's Framework-dependent and Self-contained. When .NET Core is installed it ends up in C:\program files\dotnet on Windows, for example. In the "Shared" folder there's a bunch of .NET stuff that is, well, shared. There may be multiple folders, as you can see in my folder below. You can have many and multiple installs of .NET Core.
در اینجا امکان قرار دادن یک مجموعهی کامل از ردیفها و ستونها، داخل یک ستون از پیش موجود نیز وجود دارد. برای اینکار ابتدا یک row جدید را داخل یک ستون موجود ایجاد میکنیم. با اینکار بلافاصله دسترسی به گرید 12 ستونهی بوت استرپ را داخل آن ستون خواهیم داشت؛ به همراه تمام کلاسهایی که تاکنون آنها را بررسی کردیم.
یک مثال: ایجاد ستونهای تو در تو
<head> <style> img { width: 100%; height: 200px; max-height: 200px; } </style> </head> <body> <div class="container" id="services"> <div class="row"> <section class="col-sm-8"> <img src="images/image.png" alt="sample image"> <h4>Exotic Pets</h4> <p>We offer <strong>specialized</strong> care for <em>reptiles, rodents, birds,</em> and other exotic pets.</p> </section> <section class="col-sm-4"> <div class="row no-gutters"> <div class="col-2 col-sm-4"> <img src="images/image.png" class="img-thumbnail" alt="sample image"> <p>Image 1</p> </div> <div class="col-2 col-sm-4"> <img src="images/image.png" class="img-thumbnail" alt="sample image"> <p>Image 2</p> </div> <div class="col-2 col-sm-4"> <img src="images/image.png" class="img-thumbnail" alt="sample image"> <p>Image 3</p> </div> <div class="col-2 col-sm-4"> <img src="images/image.png" class="img-thumbnail" alt="sample image"> <p>Image 4</p> </div> <div class="col-2 col-sm-4"> <img src="images/image.png" class="img-thumbnail" alt="sample image"> <p>Image 5</p> </div> <div class="col-2 col-sm-4"> <img src="images/image.png" class="img-thumbnail" alt="sample image"> <p>Image 6</p> </div> </div> </section> </div> </div> </body>
و با اندازهی صفحهی بزرگتر از sm:
توضیحات:
تعریف گرید تو در تو را در داخل دومین section تعریف شده، در کدهای فوق مشاهده میکنید:
<body> <div class="container" id="services"> <div class="row"> <section class="col-sm-8"> </section> <section class="col-sm-4"> <div class="row no-gutters"> </div> </section> </div> </div> </body>
به صورت پیشفرض در بین ستونها، یک فاصلهی 15px پیشفرض وجود دارد که به آن Gutter نیز گفته میشود. برای عدم نمایش و اعمال آن میتوان از کلاس no-gutters استفاده کرد. به همین جهت در تصویر دوم، ستونهای تعریف شده به هم چسبیدهاند.
سپس هر ستون داخل این ردیف را به صورت زیر تعریف کردهایم:
<div class="col-2 col-sm-4"> <img src="images/image.png" class="img-thumbnail" alt="sample image"> <p>Image 1</p> </div>
امکان تغییر ترتیب نمایش ستونهای گرید بوت استرپ 4
امکان تغییر ترتیب نمایش ستونهای گرید، در بوت استرپ 4 پیش بینی شدهاست و این مورد نیز بر اساس break-pointهای مختلف، قابل تنظیم است که فرمول کلاسهای آنرا در ذیل مشاهده میکنید:
در اینجا ذکر break-point اختیاری است و عدد ord بین یک تا 12 تغییر میکند.
یک مثال: تغییر ترتیب نمایش ستونهای گرید
<head> <style> img { width: 100%; height: 200px; max-height: 200px; } </style> </head> <body> <div class="container" id="services"> <h2>Flex Order</h2> <div class="row"> <section class="col order-2 d-flex flex-column"> <img src="images/image.png" class="order-2" alt="sample image"> <h4>1. Exotic Pets</h4> <p>We offer <strong>specialized</strong> care for <em>reptiles, rodents, birds,</em> and other exotic pets.</p> </section> <section class="col order-1"> <img src="images/image.png" alt="sample image"> <h4>2. Grooming</h4> <p>Our therapeutic <span class="font-weight-bold">grooming</span> treatments help battle fleas, allergic dermatitis, and other challenging skin conditions.</p> </section> <section class="col order-3"> <img src="images/image.png" alt="sample image"> <h4>3. General Health</h4> <p>Wellness and senior exams, ultrasound, x-ray, and dental cleanings are just a few of our general health services.</p> </section> </div> </div> </body>
در این مثال توسط کلاس order، مکان ستونها را تغییر داده و اولین ستون را در مکان دوم، دومی را در مکان اول و سومی را در همان مکان خودش نمایش دادهایم. باید دقت داشت که در حین تعریف کلاس order بهتر است برای تمام ستونها این ترتیب را تعریف کرد تا با نتایج ناخواستهای مواجه نشویم.
همچنین کلاس order را به سایر المانهای صفحه نیز میتوان اعمال کرد. برای مثال در تصویر فوق، در ستون دوم نمایش داده شده، متن در بالا و تصویر در پایین قرار گرفتهاست. اینکار را با تبدیل این ستون به یک flex column با افزودن کلاسهای d-flex flex-column انجام دادهایم. سپس با اعمال کلاس order-2 به تصویر، این تصویر ذیل متن نمایش داده شدهاست.
یکی از کاربردهای تغییر ترتیب نمایش ستونها در دنیای واقعی، افزودن break-point به آنها (مطابق فرمول یاد شده) و سپس نمایش منوها، پیش از محتویات صفحه در اندازههای کوچکتر صفحه است. برای مثال اگر در حالت عادی، منوهای کنار صفحه نمایش داده میشوند و در ستون سوم قرار گرفتهاند، شاید بخواهید در اندازهی نمایش موبایل، ترتیب نمایش این منوها بالاتر از متن صفحه باشد و در ابتدا قرارگیرد و نه در ترتیب سوم.
امکان تغییر تراز ستونهای گرید بوت استرپ 4
چون طراحی گرید بوت استرپ 4 مبتنی بر Flexbox است، کلاسهای قابل توجهی از آن جهت غنی سازی این سیستم طرحبندی قابل استفاده هستند:
- برای تغییر تراز عمودی ستونها، کلاس align-items-ALN را میتوان به «ردیفها» اعمال کرد. در اینجا ALN یکی از مقادیر start ،center و end را میتواند داشته باشد.
- برای تغییر تراز خود ستونها، کلاس align-self-ALN را میتوان به «ستونها» اعمال کرد. در اینجا نیز ALN یکی از مقادیر start ،center و end را میتواند داشته باشد.
- برای تغییر تراز افقی ستونها، کلاس justify-content-ALN را میتوان به «ردیفها» اعمال کرد. البته ذکر عرض ستونها در این حالت الزامی است. در اینجا ALN یکی از مقادیر start ،center ،around ،between و end را میتواند داشته باشد.
مثال: بررسی روش تغییر تراز ستونها
<head> <style> img { width: 100%; height: 100px; max-height: 100px; } </style> </head> <body> <div class="container" id="services"> <div class="row bg-info align-items-center" style="height: 100vh;"> <div class="col"> <div class="row"> <section class="col"> <img src="images/image.png" alt="sample image"> <h4>Exotic Pets</h4> <p>We offer specialized care for reptiles, rodents, birds, and other exotic pets.</p> </section> <section class="col"> <img src="images/image.png" alt="sample image"> <h4>Grooming</h4> <p>Our therapeutic grooming treatments help battle fleas, allergic dermatitis, and other challenging skin conditions.</p> </section> <section class="col"> <img src="images/image.png" alt="sample image"> <h4>General Health</h4> <p>Wellness and senior exams, ultrasound, x-ray, and dental cleanings.</p> </section> </div> </div> </div> <div class="row bg-success" style="height: 100vh;"> <section class="col"> <img src="images/image.png" alt="sample image"> <h4>Exotic Pets</h4> <p>We offer specialized care for reptiles, rodents, birds, and other exotic pets.</p> </section> <section class="col align-self-center"> <img src="images/image.png" alt="sample image"> <h4>Grooming</h4> <p>Our therapeutic grooming treatments help battle fleas, allergic dermatitis, and other challenging skin conditions.</p> </section> <section class="col align-self-end"> <img src="images/image.png" alt="sample image"> <h4>General Health</h4> <p>Wellness and senior exams, ultrasound, x-ray, and dental cleanings.</p> </section> </div> <div class="row bg-warning justify-content-center" style="height: 100vh;"> <section class="col-4"> <img src="images/image.png" alt="sample image"> <h4>Exotic Pets</h4> <p>We offer specialized care for reptiles, rodents, birds, and other exotic pets.</p> </section> <section class="col-4"> <img src="images/image.png" alt="sample image"> <h4>Grooming</h4> <p>Our therapeutic grooming treatments help battle fleas, allergic dermatitis, and other challenging skin conditions.</p> </section> </div> </div><!-- container --> </body>
در اینجا برای هر ردیف یک height: 100vh درنظر گرفته شدهاست تا کل ارتفاع view-port را پر کند و همچنین برای هر ردیف نیز یک رنگ پس زمینه درنظر گرفتهایم تا تغییر ترازها، مشخصتر باشند.
ابتدا داخل container چنین تعریفی را مشاهده میکنید:
<div class="row bg-info align-items-center" style="height: 100vh;"> <div class="col"> <div class="row"> <section class="col">
وجود row و col بعدی که داخل col اصلی تعریف شدهاست، سبب میشوند تا تمام آیتمها در یک سطر و در یک تراز افقی نمایش داده شوند. اگر این row و col دوم را حذف کنیم، هر آیتم نسبت به محتوای آن در میانهی صفحه قرار میگیرد و یکی بالاتر و دیگری پایینتر نمایش داده خواهند شد.
سپس در ردیف بعدی، کلاسهای align-self-center و align-self-end را بر روی ستونها آزمایش کردهایم:
و در آخر تاثیر اعمال justify-content-center را بر روی یک ردیف مشاهده میکنید:
همانطور که مشاهده میکنید، این کلاسهای Flexbox، کار با ستونهای بوت استرپ را بسیار انعطاف پذیر کردهاند.
روشهای دیگری برای تعیین محل قرارگیری ستونهای بوت استرپ 4
علاوه بر روشهایی که تاکنون آنها را بررسی کردیم، کلاسهای دیگری نیز برای تعیین محل قرارگیری ستونهای بوت استرپ تدارک دیده شدهاند:
- کلاسهای تعیین محل ستونها: fixed-top, fixed-bottom, sticky-top
fixed-top: ستون را در بالای صفحه قرار میدهد.
fixed-bottom: ستون و المان را در پایین صفحه قرار میدهد.
sticky-top: ستون و المان را در بالای صفحه قرار میدهد و با اسکرول صفحه به پایین، باز هم این المان در همان بالای صفحه قابل مشاهدهاست.
- کلاسهای نمایشی برای شبیه سازی ویژگیهای CSS:
این کلاسها با d شروع میشوند؛ به همراه یک break-point اختیاری که هدف آنها در اختیار گذاشتن توانمندیهای نمایشی CSS در بوت استرپ است.
برای مثال کلاس d-md-none به این معنا است که پس از رد شدن از اندازهی md، این المان دیگر نمایش داده نخواهد شد.
- کلاسهای container مقدماتی Flex:
این کلاسها که موارد داخل پرانتز آنها اختیاری است، المان را تبدیل به یک المان Flexbox میکنند. حالت نمایشی پیشفرض آنها block است؛ اما اگر نیاز بود میتوان آنها را تبدیل به in-line نیز کرد.
یک مثال: بررسی روشهای متفاوت تعیین محل قرارگیری المانها
اگر کلاس fixed-bottom را به المانی انتساب دهیم:
<div class="container bg-success"> <div class="bg-info fixed-bottom"> <div class="item">Exotic Pets</div> <div class="item">Grooming</div> <div class="item">Health</div> </div>
کلاس fixed-top نیز چنین کاری را انجام میدهد، فقط المان را بجای پایین صفحه، در بالای صفحه به صورت ثابت نمایش خواهد داد.
در اینجا اگر کلاس sticky-top را اعمال کنیم، هرچند شبیه به fixed-top عمل میکند، اما با container تراز است:
تاثیر کلاسهای flex را در قسمت بعدی به تفصیل بررسی خواهیم کرد.
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید: Bootstrap4_05.zip
فایل ARCHITECTURE.md
If you maintain an open-source project in the range of 10k-200k lines of code, I strongly encourage you to add an ARCHITECTURE document next to README and CONTRIBUTING. Before going into the details of why and how, I want to emphasize that this is not another “docs are good, write more docs” advice. I am pretty sloppy about documentation, and, eg, I often use just “simplify” as a commit message. Nonetheless, I feel strongly about the issue, even to the point of pestering you:-)
Windows 10 has something called Windows Subsystem for Linux and this something enables us to run Linux applications on Windows 10 using Linux without need for Hyper-V or other virtual machines. When building multi-platform applications like my open-source TemperatureStation solution then having Linux right there for testing comes very handy. This blog post shows how to get Linux running on Windows, how to install .NET Core and how to run web applications on Linux.
Unhandled exceptions are a bit of a misnomer. In .NET, every exception is handled. By the time you access the specifics of an error in your Try-Catch block, the Framework has already analyzed the problem, built a structure to contain its details, examined the stack trace, and used reflection to pinpoint the location of the error, among other mundane tasks. In short, when errors occur, .NET serves them up to your code in a neatly packaged, highly examinable data block.