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

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

1
HttpClient.GetAsync พร้อมข้อมูลรับรองเครือข่าย
ฉันกำลังใช้HttpWebRequestเพื่อรับเว็บไซต์ HttpWebRequestsฉันต้องการที่จะใช้รูปแบบการรอคอยซึ่งไม่ได้รับ ฉันพบชั้นเรียนHttpClientซึ่งดูเหมือนจะเป็นคลาส Http worker ใหม่ ฉันกำลังใช้HttpClient.GetAsync(...)เพื่อค้นหาหน้าเว็บของฉัน แต่ฉันหายไปเลือกที่จะเพิ่มเช่นClientCredentials HttpWebRequest.Credentialsมีวิธีใดในการให้HttpClientข้อมูลการรับรองความถูกต้องหรือไม่?

5
ฉันควรกังวลเกี่ยวกับ "วิธีการ async นี้ไม่มีตัวดำเนินการ" รอ "และจะเรียกใช้คำเตือนพร้อมกัน"
ฉันมีอินเทอร์เฟซที่เปิดเผยวิธีการ async บางอย่าง โดยเฉพาะอย่างยิ่งมันมีวิธีการที่กำหนดไว้ซึ่งส่งคืน Task หรือ Task <T> ฉันใช้คำหลัก async / await ฉันอยู่ระหว่างการใช้งานอินเทอร์เฟซนี้ อย่างไรก็ตามในวิธีการเหล่านี้บางส่วนการนำไปใช้งานนี้ไม่มีอะไรต้องรอ ด้วยเหตุนี้ฉันจึงได้รับคำเตือนของคอมไพเลอร์ "วิธีการ async นี้ไม่มีตัวดำเนินการ 'รอ' และจะทำงานพร้อมกัน ... " ฉันเข้าใจว่าทำไมฉันถึงได้รับข้อผิดพลาด แต่ฉันสงสัยว่าฉันควรทำอะไรกับพวกเขาในบริบทนี้หรือไม่ รู้สึกผิดที่ละเลยคำเตือนของคอมไพเลอร์ ฉันรู้ว่าฉันสามารถแก้ไขได้โดยรองานเรียกใช้ แต่รู้สึกว่าผิดสำหรับวิธีการที่ใช้งานได้ไม่แพงเพียงไม่กี่อย่าง ดูเหมือนว่ามันจะเพิ่มค่าใช้จ่ายที่ไม่จำเป็นในการดำเนินการ แต่ฉันก็ไม่แน่ใจว่ามีอยู่แล้วหรือไม่เพราะมีคีย์เวิร์ด async อยู่ ฉันควรเพิกเฉยต่อคำเตือนหรือมีวิธีการแก้ไขที่ฉันไม่เห็นหรือไม่?

3
มันเป็นการต่อต้านรูปแบบที่จะใช้ async / await ภายในตัวสร้าง Promise () ใหม่หรือไม่?
ฉันกำลังใช้async.eachLimitฟังก์ชันเพื่อควบคุมจำนวนการดำเนินการสูงสุดในแต่ละครั้ง const { eachLimit } = require("async"); function myFunction() { return new Promise(async (resolve, reject) => { eachLimit((await getAsyncArray), 500, (item, callback) => { // do other things that use native promises. }, (error) => { if (error) return reject(error); // resolve here passing the next value. }); }); } …

4
เหตุใด HttpContext.Current จึงเป็นโมฆะหลังจากรอ
ฉันมีรหัสทดสอบ WebAPI ต่อไปนี้ฉันไม่ได้ใช้ WebAPI ในการผลิต แต่ฉันทำสิ่งนี้เพราะการสนทนาที่ฉันมีเกี่ยวกับคำถามนี้: คำถามWebAPI Async อย่างไรก็ตามนี่คือวิธีการ WebAPI ที่ไม่เหมาะสม: public async Task<string> Get(int id) { var x = HttpContext.Current; if (x == null) { // not thrown throw new ArgumentException("HttpContext.Current is null"); } await Task.Run(() => { Task.Delay(500); id = 3; }); x = HttpContext.Current; if (x == …

1
Await เป็นข้อผิดพลาดของคำสงวนในฟังก์ชัน async
ฉันกำลังดิ้นรนเพื่อหาปัญหาเกี่ยวกับไวยากรณ์ต่อไปนี้: export const sendVerificationEmail = async () => (dispatch) => { try { dispatch({ type: EMAIL_FETCHING, payload: true }); await Auth.sendEmailVerification(); dispatch({ type: EMAIL_FETCHING, payload: false })) } catch (error) { dispatch({ type: EMAIL_FETCHING, payload: false }); throw new Error(error); } }; ฉันได้รับข้อผิดพลาดอยู่เสมอว่า: การรอคอยเป็นคำสงวน ... แต่มันไม่ถูกต้องตามกฎหมายในฟังก์ชัน async ใช่หรือไม่? บิตการจัดส่งมาจากไลบรารีreact-thunk

4
ความแตกต่างระหว่าง“ await Task.Run (); กลับ;" และ "return Task.Run ()"?
มีความแตกต่างทางแนวคิดระหว่างรหัสสองชิ้นต่อไปนี้หรือไม่: async Task TestAsync() { await Task.Run(() => DoSomeWork()); } และ Task TestAsync() { return Task.Run(() => DoSomeWork()); } รหัสที่สร้างขึ้นแตกต่างกันหรือไม่? แก้ไข:เพื่อหลีกเลี่ยงความสับสนTask.Runกรณีที่คล้ายกัน: async Task TestAsync() { await Task.Delay(1000); } และ Task TestAsync() { return Task.Delay(1000); } การอัปเดตล่าสุด:นอกจากคำตอบที่ยอมรับแล้วยังมีความแตกต่างในวิธีLocalCallContextจัดการ: CallContext.LogicalGetData ได้รับการกู้คืนแม้ว่าจะไม่มีอะซิงโครไนซ์ ทำไม?
90 c#  async-await 

3
เอนทิตีเฟรมเวิร์ก SaveChanges () เทียบกับ SaveChangesAsync () และ Find () เทียบกับ FindAsync ()
ฉันได้ค้นหาความแตกต่างระหว่าง 2 คู่ข้างต้น แต่ไม่พบบทความใด ๆ ที่อธิบายอย่างชัดเจนเกี่ยวกับเรื่องนี้รวมถึงเวลาที่ควรใช้อย่างใดอย่างหนึ่ง แล้วอะไรคือความแตกต่างระหว่างSaveChanges()และSaveChangesAsync()? และระหว่างFind()และFindAsync()? ในฝั่งเซิร์ฟเวอร์เมื่อเราใช้Asyncวิธีการเราต้องเพิ่มawaitไฟล์. ดังนั้นฉันไม่คิดว่ามันเป็นแบบอะซิงโครนัสที่ฝั่งเซิร์ฟเวอร์ ช่วยป้องกัน UI ที่ปิดกั้นบนเบราว์เซอร์ฝั่งไคลเอ็นต์เท่านั้นหรือไม่? หรือมีข้อดีข้อเสียระหว่างกันหรือไม่?

5
จะรอรายการงานแบบอะซิงโครนัสโดยใช้ LINQ ได้อย่างไร?
ฉันมีรายการงานที่ฉันสร้างไว้ดังนี้: public async Task<IList<Foo>> GetFoosAndDoSomethingAsync() { var foos = await GetFoosAsync(); var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList(); ... } โดยการใช้.ToList()งานควรเริ่มต้นทั้งหมด ตอนนี้ฉันต้องการรอให้เสร็จสิ้นและส่งคืนผลลัพธ์ สิ่งนี้ใช้ได้ใน...บล็อกด้านบน: var list = new List<Foo>(); foreach (var task in tasks) list.Add(await task); return list; มันทำในสิ่งที่ฉันต้องการ แต่ดูเหมือนจะค่อนข้างเงอะงะ ฉันอยากจะเขียนอะไรที่ง่ายกว่านี้: return tasks.Select(async task => await task).ToList(); ... แต่นี่ไม่ได้รวบรวม ฉันขาดอะไรไป? …
88 c#  linq  async-await 

4
วิธีใช้รอวนซ้ำ
ฉันกำลังพยายามสร้างแอปคอนโซลแบบอะซิงโครนัสที่ทำงานบางอย่างกับคอลเลกชัน ฉันมีเวอร์ชันหนึ่งที่ใช้แบบขนานสำหรับลูปเวอร์ชันอื่นที่ใช้ async / await ฉันคาดว่าเวอร์ชัน async / await จะทำงานคล้ายกับเวอร์ชันคู่ขนาน แต่ดำเนินการพร้อมกัน ผมทำอะไรผิดหรือเปล่า? class Program { static void Main(string[] args) { var worker = new Worker(); worker.ParallelInit(); var t = worker.Init(); t.Wait(); Console.ReadKey(); } } public class Worker { public async Task<bool> Init() { var series = Enumerable.Range(1, 5).ToList(); foreach (var …
87 c#  .net  async-await 

4
มีอะไรเช่น Asynchronous BlockingCollection <T> หรือไม่?
ฉันต้องการawaitผลลัพธ์ของBlockingCollection&lt;T&gt;.Take()แบบอะซิงโครนัสดังนั้นฉันจึงไม่บล็อกเธรด กำลังมองหาอะไรเช่นนี้: var item = await blockingCollection.TakeAsync(); ฉันรู้ว่าฉันทำได้: var item = await Task.Run(() =&gt; blockingCollection.Take()); แต่นั่นเป็นการฆ่าความคิดทั้งหมดเพราะเธรดอื่นThreadPoolถูกบล็อกแทน มีทางเลือกอื่นไหม

5
ใช้ a wait ภายนอกฟังก์ชัน async
ฉันพยายามเชื่อมโยงฟังก์ชัน async สองฟังก์ชันเข้าด้วยกันเนื่องจากฟังก์ชันแรกมีพารามิเตอร์ส่งคืนตามเงื่อนไขที่ทำให้วินาทีทำงานหรือออกจากโมดูล อย่างไรก็ตามฉันพบพฤติกรรมแปลก ๆ ที่ไม่พบในข้อกำหนด async function isInLobby() { //promise.all([chained methods here]) let exit = false; if (someCondition) exit = true; } นี่คือตัวอย่างโค้ดของฉันที่ถูกทำลาย (คุณสามารถดูขอบเขตทั้งหมดได้ที่นี่ ) ซึ่งจะตรวจสอบว่าผู้เล่นอยู่ในล็อบบี้แล้วหรือไม่ แต่ไม่เกี่ยวข้อง ต่อไปเรามีฟังก์ชัน async นี้ async function countPlayer() { const keyLength = await scardAsync(game); return keyLength; } exit === trueฟังก์ชั่นนี้ไม่จำเป็นต้องให้ทำงานถ้า ฉันพยายามที่จะทำ const inLobby = …

9
รอคอยในการสกัดกั้น
ฉันมีรหัสต่อไปนี้: WebClient wc = new WebClient(); string result; try { result = await wc.DownloadStringTaskAsync( new Uri( "http://badurl" ) ); } catch { result = await wc.DownloadStringTaskAsync( new Uri( "http://fallbackurl" ) ); } โดยทั่วไปฉันต้องการดาวน์โหลดจาก URL และเมื่อล้มเหลวโดยมีข้อยกเว้นฉันต้องการดาวน์โหลดจาก URL อื่น ทั้งสองเวลาไม่ตรงกันแน่นอน อย่างไรก็ตามรหัสไม่ได้รวบรวมเนื่องจาก ข้อผิดพลาด CS1985: ไม่สามารถรอในเนื้อหาของประโยค catch ตกลงห้ามไม่ว่าด้วยเหตุผลใด แต่รูปแบบรหัสที่ถูกต้องนี่คืออะไร แก้ไข: ข่าวดีก็คือว่าC # 6.0 มีแนวโน้มที่จะช่วยให้สายรอคอยทั้งในและในที่สุดก็จับบล็อก

5
ฟังก์ชัน Async พร้อม + =
let x = 0; async function test() { x += await 5; console.log('x :', x); } test(); x += 1; console.log('x :', x); เรียกใช้ข้อมูลโค้ดซ่อนผลลัพธ์ขยายตัวอย่างข้อมูล ค่าของxลงทะเบียนเป็นและ1 5คำถามของฉันคือ: ทำไมมูลค่าของการx 5เข้าสู่ระบบที่สอง? หากtestมีการดำเนินการหลังจากx += 1(เพราะมันเป็นฟังก์ชั่น async) แล้วค่าของ x 1 ตามเวลาที่testจะดำเนินการดังนั้นควรจะทำให้ค่าของx += await 5x 6

4
วิธีที่เหมาะสมในการจัดการกับข้อยกเว้นใน AsyncDispose
ระหว่างเปลี่ยนเป็น. NET Core 3 IAsynsDisposableใหม่ฉันได้พบกับปัญหาต่อไปนี้ แกนหลักของปัญหา: ถ้าDisposeAsyncมีข้อยกเว้นข้อยกเว้นนี้ซ่อนข้อยกเว้นใด ๆ ที่ถูกโยนลงในawait using-block class Program { static async Task Main() { try { await using (var d = new D()) { throw new ArgumentException("I'm inside using"); } } catch (Exception e) { Console.WriteLine(e.Message); // prints I'm inside dispose } } } class D …

3
ทำไมต้องทำงานต่อเนื่องเมื่องานทั้งหมดถูกดำเนินการพร้อมกัน?
ฉันเพิ่งสังเกตข้อสงสัยเกี่ยวกับTask.WhenAllวิธีการเมื่อทำงานบน. NET Core 3.0 ฉันส่งTask.Delayงานง่าย ๆเป็นอาร์กิวเมนต์เดียวไปยังTask.WhenAllและฉันคาดว่างานที่ถูกห่อจะทำงานเหมือนกันกับงานต้นฉบับ แต่นี่ไม่ใช่กรณี ความต่อเนื่องของงานดั้งเดิมจะถูกดำเนินการแบบอะซิงโครนัส (ซึ่งเป็นที่ต้องการ) และความต่อเนื่องของหลาย ๆ ตัวTask.WhenAll(task)จะถูกดำเนินการแบบซิงโครนัสแบบหนึ่งหลังจากสิ่งอื่น ๆ นี่คือตัวอย่างของพฤติกรรมนี้ งานของผู้ปฏิบัติงานสี่คนกำลังรอTask.Delayงานเดียวกันให้เสร็จและดำเนินการคำนวณต่อไปอย่างหนัก (จำลองโดย a Thread.Sleep) var task = Task.Delay(500); var workers = Enumerable.Range(1, 4).Select(async x =&gt; { Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} before await"); await task; //await Task.WhenAll(task); Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} after await"); Thread.Sleep(1000); // …

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