คำถามติดแท็ก async-await

สิ่งนี้ครอบคลุมรูปแบบการเขียนโปรแกรมแบบอะซิงโครนัสที่รองรับโดยภาษาการเขียนโปรแกรมต่างๆโดยใช้ async และรอคำสำคัญ

7
การใช้คำต่อท้าย "Async" ในชื่อเมธอดนั้นขึ้นอยู่กับว่าใช้ตัวแก้ไข "async" หรือไม่
หลักการสำหรับการต่อท้ายชื่อเมธอดด้วย "Async" คืออะไร? คำต่อท้าย "Async" ควรต่อท้ายเฉพาะเมธอดที่ประกาศด้วยasyncตัวปรับแต่งหรือไม่ public async Task<bool> ConnectAsync() หรือเพียงพอที่วิธีการคืนค่าTask<T>หรือTask? public Task<bool> ConnectAsync()

2
ConfigureAwait (false) เกี่ยวข้องใน ASP.NET Core หรือไม่
ฉันพบปัญหา ( https://github.com/HTBox/allReady/issues/1313 ) ที่ GitHub ซึ่งพวกเขาคุยกันเกี่ยวกับการConfigureAwait(false)เอาโค้ดออกโดยอ้างว่าในASP.NET Core การโทรไปConfigureAwait(false)ซ้ำซ้อนและไม่ทำอะไรเลย สิ่งที่ดีที่สุดที่ฉันสามารถหาได้ที่นี่คือ "บันทึกด้านข้าง" ในคำตอบ (จาก Stephen Cleary, https://stackoverflow.com/a/40220190/2805831 ) บอกว่า ASP.NET Core ไม่มี "บริบท" อีกต่อไป ดังนั้นจึงConfigureAwait(false)ไม่จำเป็นจริงๆในASP.NET Core (แม้ว่าจะใช้. Net Framework แบบเต็ม)? มันมีประสิทธิภาพที่แท้จริงในบางกรณีหรือไม่หรือความแตกต่างในผลลัพธ์ / ความหมาย? แก้ไข:ในแง่มุมนี้จะแตกต่างกันหรือไม่ถ้าฉันโฮสต์เป็นแอปพลิเคชันคอนโซลหรือใน IIS

4
เหตุใดฟังก์ชันทั้งหมดจึงไม่ควรเป็น async ตามค่าเริ่มต้น
async-รอคอยรูปแบบของสุทธิ 4.5 มีการเปลี่ยนแปลงกระบวนทัศน์ เกือบจะดีเกินไปที่จะเป็นจริง ฉันได้ย้ายรหัส IO-heavy ไปยัง async-await เพราะการบล็อกเป็นเรื่องในอดีต มีคนไม่กี่คนที่เปรียบเทียบ async-await กับ zombie infestation และฉันพบว่ามันค่อนข้างแม่นยำ รหัส Async ชอบรหัส async อื่น ๆ (คุณต้องมีฟังก์ชัน async เพื่อรอฟังก์ชัน async) ฟังก์ชันที่มากขึ้นเรื่อย ๆ จึงกลายเป็น async และสิ่งนี้จะเติบโตขึ้นเรื่อย ๆ ใน codebase ของคุณ การเปลี่ยนฟังก์ชั่นเป็น async ค่อนข้างซ้ำซากและไม่น่าแปลกใจ โยนasyncคีย์เวิร์ดในการประกาศตัดค่าส่งคืนTask<>และคุณก็ทำได้สำเร็จ มันค่อนข้างจะไม่มั่นคงว่ากระบวนการทั้งหมดนั้นง่ายเพียงใดและในไม่ช้าสคริปต์การแทนที่ข้อความจะทำให้ "การย้าย" ส่วนใหญ่เป็นไปโดยอัตโนมัติ และตอนนี้คำถาม .. ถ้าโค้ดทั้งหมดของฉันค่อยๆเปลี่ยน async ทำไมไม่ทำให้ async ทั้งหมดเป็นค่าเริ่มต้นล่ะ เหตุผลที่ชัดเจนที่ฉันคิดคือประสิทธิภาพ Async-await …

3
พยายามดิ้นรนเพื่อให้คุกกี้ไม่ตอบสนองกับ HttpClient ใน. net 4.5
ฉันมีรหัสต่อไปนี้ที่ใช้งานได้สำเร็จ ฉันคิดไม่ออกว่าจะเอาคุกกี้ออกจากการตอบกลับอย่างไร เป้าหมายของฉันคือฉันต้องการตั้งค่าคุกกี้ในคำขอและนำคุกกี้ออกจากการตอบกลับ ความคิด? private async Task<string> Login(string username, string password) { try { string url = "http://app.agelessemail.com/account/login/"; Uri address = new Uri(url); var postData = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("username", username), new KeyValuePair<string, string>("password ", password) }; HttpContent content = new FormUrlEncodedContent(postData); var cookieJar = new CookieContainer(); …

5
อะไรคือความแตกต่างระหว่างสัญญา JavaScript และ async รอ?
ฉันใช้คุณสมบัติECMAScript 6และ ECMAScript 7 อยู่แล้ว (ขอบคุณ Babel) ในแอปพลิเคชันของฉัน - ทั้งมือถือและเว็บ ขั้นตอนแรกที่เห็นได้ชัดคือ ECMAScript 6 ระดับ ฉันได้เรียนรู้รูปแบบการไม่ซิงค์คำสัญญา (ซึ่งมีแนวโน้มจริงๆ) เครื่องกำเนิดไฟฟ้า (ไม่แน่ใจว่าทำไมจึงต้องใช้สัญลักษณ์ *) ฯลฯ จากสิ่งเหล่านี้สัญญาจึงเหมาะกับจุดประสงค์ของฉัน และฉันได้ใช้มันในแอปพลิเคชันของฉันค่อนข้างมาก นี่คือตัวอย่าง / รหัสเทียมของวิธีที่ฉันใช้คำสัญญาพื้นฐาน - var myPromise = new Promise( function (resolve,reject) { var x = MyDataStore(myObj); resolve(x); }); myPromise.then( function (x) { init(x); }); เมื่อเวลาผ่านไปฉันได้พบกับคุณลักษณะของ ECMAScript 7 และหนึ่งในนั้นคือASYNCและAWAITคำหลัก …

5
จะให้ผลตอบแทนและรอดำเนินการตามขั้นตอนการควบคุมใน. NET ได้อย่างไร
ตามที่ฉันเข้าใจyieldคำสำคัญหากใช้จากภายในบล็อกตัววนซ้ำมันจะส่งคืนขั้นตอนการควบคุมไปยังรหัสการเรียกและเมื่อตัววนซ้ำถูกเรียกอีกครั้งคำหลักจะดึงขึ้นมาจากจุดที่ค้างไว้ นอกจากนี้awaitไม่เพียง แต่รอผู้เรียกเท่านั้น แต่ยังส่งกลับการควบคุมไปยังผู้โทรเพียงเพื่อเลือกจุดที่ค้างไว้เมื่อผู้เรียกawaitsใช้เมธอด กล่าวอีกนัยหนึ่ง - ไม่มีเธรดและ "ภาวะพร้อมกัน" ของ async และการรอคอยเป็นภาพลวงตาที่เกิดจากการควบคุมอย่างชาญฉลาดซึ่งรายละเอียดจะถูกปกปิดโดยไวยากรณ์ ตอนนี้ฉันเป็นอดีตโปรแกรมเมอร์แอสเซมบลีและฉันคุ้นเคยกับตัวชี้คำสั่งสแต็กและอื่น ๆ เป็นอย่างดีและฉันได้รับวิธีการทำงานของโฟลว์การควบคุมปกติ (รูทีนย่อยการเรียกซ้ำลูปสาขา) แต่โครงสร้างใหม่เหล่านี้ - ฉันไม่เข้าใจ เมื่อawaitถึงเวลารันไทม์จะรู้ได้อย่างไรว่าโค้ดส่วนใดควรรันต่อไป มันรู้ได้อย่างไรว่ามันสามารถกลับมาทำงานต่อจากจุดที่ค้างไว้ได้อย่างไรและมันจำได้อย่างไร เกิดอะไรขึ้นกับ call stack ปัจจุบันได้รับการบันทึกหรือไม่? จะเกิดอะไรขึ้นถ้าวิธีการโทรทำให้เมธอดอื่นเรียกก่อน - awaitเหตุใดสแต็กจึงไม่ถูกเขียนทับ และรันไทม์บนโลกจะทำงานผ่านสิ่งนี้ได้อย่างไรในกรณีที่มีข้อยกเว้นและสแต็กคลายตัว เมื่อyieldถึงเวลารันไทม์จะติดตามจุดที่ควรหยิบสิ่งของได้อย่างไร? สถานะตัวทำซ้ำถูกเก็บรักษาไว้อย่างไร

2
วิธีใช้ RestSharp กับ async / await
ฉันพยายามที่จะหาตัวอย่างที่ทันสมัยของบาง # รหัสตรงกัน C ที่ใช้ RestSharp ด้วยและasync awaitฉันรู้ว่ามีการอัปเดตล่าสุดโดย Haackแต่ฉันไม่รู้วิธีใช้วิธีการใหม่นี้ นอกจากนี้ฉันจะให้โทเค็นการยกเลิกได้อย่างไรเพื่อให้สามารถยกเลิกการดำเนินการได้ (เช่นหากมีคนไม่อยากรอและกดปุ่มยกเลิกใน UI ของแอป)

5
เหตุใดการกระทำ async จึงหยุดทำงาน
ฉันมีหลายชั้นสุทธิ 4.5 โปรแกรมประยุกต์ที่เรียกวิธีการใช้ C # 's ใหม่asyncและawaitคำหลักที่เพิ่งแฮงค์และผมก็ไม่สามารถดูว่าทำไม ที่ด้านล่างฉันมีวิธีการ async ที่ขยายยูทิลิตี้ฐานข้อมูลของเราOurDBConn(โดยทั่วไปจะเป็น wrapper สำหรับพื้นฐานDBConnectionและDBCommandวัตถุ): public static async Task<T> ExecuteAsync<T>(this OurDBConn dataSource, Func<OurDBConn, T> function) { string connectionString = dataSource.ConnectionString; // Start the SQL and pass back to the caller until finished T result = await Task.Run( () => { // Copy the …

4
จะ "รอ" การติดต่อกลับได้อย่างไร?
เมื่อใช้การโทรกลับธรรมดาเช่นในตัวอย่างด้านล่าง: test() { api.on( 'someEvent', function( response ) { return response; }); } ฟังก์ชันจะเปลี่ยนไปใช้ async / await ได้อย่างไร? โดยเฉพาะสมมติว่ามีการเรียกใช้ 'someEvent' ครั้งเดียวและครั้งเดียวฉันต้องการให้การทดสอบฟังก์ชันเป็นฟังก์ชัน async ซึ่งจะไม่ส่งคืนจนกว่าจะมีการเรียกกลับเช่น async test() { return await api.on( 'someEvent' ); }

3
เอนทิตีเฟรมเวิร์ก Queryable async
ฉันกำลังทำงานกับบางสิ่งบางอย่างของ Web API โดยใช้ Entity Framework 6 และหนึ่งในวิธีการควบคุมของฉันคือ "รับทั้งหมด" ที่คาดว่าจะได้รับเนื้อหาของตารางจากฐานข้อมูลของฉันเป็นIQueryable<Entity>. ในที่เก็บของฉันฉันสงสัยว่ามีเหตุผลที่เป็นประโยชน์หรือไม่ที่จะทำสิ่งนี้แบบอะซิงโครนัสเนื่องจากฉันเพิ่งเริ่มใช้ EF กับ async โดยทั่วไปจะเดือดถึง public async Task<IQueryable<URL>> GetAllUrlsAsync() { var urls = await context.Urls.ToListAsync(); return urls.AsQueryable(); } เทียบกับ public IQueryable<URL> GetAllUrls() { return context.Urls.AsQueryable(); } เวอร์ชัน async จะให้ผลประโยชน์ด้านประสิทธิภาพที่นี่จริงหรือฉันมีค่าใช้จ่ายที่ไม่จำเป็นโดยการฉายไปที่รายการก่อน (โดยใช้ async ในใจคุณ) และจากนั้นจะเป็น IQueryable?

3
การโทรแบบ Async ด้วยการรอใน HttpClient จะไม่ส่งกลับ
ฉันมีสายที่ฉันโทรจากภายในC#แอปพลิเคชันรถไฟใต้ดินที่ใช้xaml บน Win8 CP สายนี้เพียงแค่กระทบบริการเว็บและส่งคืนข้อมูล JSON HttpMessageHandler handler = new HttpClientHandler(); HttpClient httpClient = new HttpClient(handler); httpClient.BaseAddress = new Uri("http://192.168.1.101/api/"); var result = await httpClient.GetStreamAsync("weeklyplan"); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeeklyPlanData[])); return (WeeklyPlanData[])ser.ReadObject(result); มันค้างที่awaitแต่การโทรhttpส่งกลับเกือบจะในทันที (ยืนยันผ่านมือไม่พาย); ราวกับว่าawaitถูกเพิกเฉยและมันก็ค้างอยู่ที่นั่น ก่อนที่คุณจะถาม - ใช่ - ความสามารถของเครือข่ายส่วนตัวเปิดอยู่ ความคิดใด ๆ ที่จะแขวน?

5
ตัวอย่าง async / await ที่ทำให้เกิดการชะงักงัน
ฉันพบแนวทางปฏิบัติที่ดีที่สุดสำหรับการเขียนโปรแกรมแบบอะซิงโครนัสโดยใช้ c # async/ awaitคำหลัก (ฉันเพิ่งเริ่มใช้ c # 5.0) หนึ่งในคำแนะนำที่ได้รับมีดังต่อไปนี้: ความเสถียร: รู้บริบทการซิงโครไนซ์ของคุณ ... บริบทการซิงโครไนซ์บางส่วนไม่ได้ reentrant และ single-threaded ซึ่งหมายความว่าสามารถทำงานได้เพียงหน่วยเดียวในบริบทในช่วงเวลาที่กำหนด ตัวอย่างนี้คือเธรด UI ของ Windows หรือบริบทการร้องขอ ASP.NET ในบริบทการซิงโครไนซ์แบบเธรดเดี่ยวเหล่านี้คุณสามารถหยุดชะงักได้โดยง่าย หากคุณวางภารกิจจากบริบทเธรดเดียวให้รองานนั้นในบริบทรหัสรอของคุณอาจบล็อกงานเบื้องหลัง public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { …

2
การห่อรหัสซิงโครนัสเป็นการโทรแบบอะซิงโครนัส
ฉันมีวิธีการในแอปพลิเคชัน ASP.NET ซึ่งใช้เวลาค่อนข้างมากในการดำเนินการ การเรียกใช้เมธอดนี้อาจเกิดขึ้นได้สูงสุด 3 ครั้งระหว่างคำขอของผู้ใช้หนึ่งครั้งขึ้นอยู่กับสถานะแคชและพารามิเตอร์ที่ผู้ใช้ระบุ การโทรแต่ละครั้งจะใช้เวลาประมาณ 1-2 วินาทีจึงจะเสร็จสมบูรณ์ วิธีนี้เป็นการโทรแบบซิงโครนัสไปยังบริการและไม่มีความเป็นไปได้ที่จะลบล้างการใช้งาน ดังนั้นการโทรแบบซิงโครนัสไปยังบริการจึงมีลักษณะดังนี้: public OutputModel Calculate(InputModel input) { // do some stuff return Service.LongRunningCall(input); } และการใช้วิธีการคือ (โปรดทราบว่าการเรียกใช้เมธอดนั้นอาจเกิดขึ้นมากกว่าหนึ่งครั้ง): private void MakeRequest() { // a lot of other stuff: preparing requests, sending/processing other requests, etc. var myOutput = Calculate(myInput); // stuff again } ฉันพยายามเปลี่ยนการใช้งานจากด้านข้างของฉันเพื่อให้สามารถใช้งานวิธีนี้ได้พร้อมกันและนี่คือสิ่งที่ฉันทำจนถึงตอนนี้ …

1
ประสิทธิภาพที่น่ากลัวโดยใช้วิธี SqlCommand Async ที่มีข้อมูลขนาดใหญ่
ฉันมีปัญหาด้านประสิทธิภาพการทำงานของ SQL ที่สำคัญเมื่อใช้การโทรแบบ async ฉันได้สร้างกรณีเล็ก ๆ เพื่อแสดงให้เห็นถึงปัญหา ฉันได้สร้างฐานข้อมูลบน SQL Server 2016 ซึ่งอยู่ใน LAN ของเรา (ไม่ใช่ localDB) ในฐานข้อมูลนั้นฉันมีตารางที่WorkingCopyมี 2 ​​คอลัมน์: Id (nvarchar(255, PK)) Value (nvarchar(max)) DDL CREATE TABLE [dbo].[Workingcopy] ( [Id] [nvarchar](255) NOT NULL, [Value] [nvarchar](max) NULL, CONSTRAINT [PK_Workingcopy] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, …

4
ทางออกที่ดีสำหรับการรอคอยในการลอง / จับ / ในที่สุด?
ฉันต้องเรียกใช้asyncเมธอดในcatchบล็อกก่อนที่จะโยนข้อยกเว้นอีกครั้ง (ด้วยการติดตามสแต็ก) เช่นนี้ try { // Do something } catch { // <- Clean things here with async methods throw; } แต่น่าเสียดายที่คุณไม่สามารถใช้awaitใน a catchหรือfinallyblock ได้ ฉันได้เรียนรู้ว่าเป็นเพราะคอมไพเลอร์ไม่มีทางย้อนกลับไปในcatchบล็อกเพื่อดำเนินการตามawaitคำสั่งของคุณหรืออะไรทำนองนั้น ... ฉันพยายามใช้Task.Wait()เพื่อแทนที่awaitและฉันมีการหยุดชะงัก ฉันค้นหาบนเว็บว่าฉันจะหลีกเลี่ยงปัญหานี้ได้อย่างไรและพบไซต์นี้ เนื่องจากฉันไม่สามารถเปลี่ยนasyncวิธีการและฉันไม่รู้ว่าพวกเขาใช้ConfigureAwait(false)หรือไม่ฉันจึงสร้างวิธีการเหล่านี้ขึ้นมาซึ่งใช้วิธีFunc<Task>เริ่มต้นวิธี async เมื่อเราอยู่ในเธรดอื่น (เพื่อหลีกเลี่ยงการหยุดชะงัก) และรอให้มันเสร็จสิ้น: public static void AwaitTaskSync(Func<Task> action) { Task.Run(async () => await action().ConfigureAwait(false)).Wait(); } public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.