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

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

20
ใช้ async / await กับ forEach loop
มีปัญหากับการใช้async/ awaitในการforEachวนซ้ำหรือไม่? ฉันพยายามวนซ้ำไฟล์ต่าง ๆ และawaitเนื้อหาของแต่ละไฟล์ import fs from 'fs-promise' async function printFiles () { const files = await getFilePaths() // Assume this works fine files.forEach(async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) }) } printFiles() รหัสนี้ใช้งานได้ แต่มีบางอย่างผิดปกติกับสิ่งนี้หรือไม่ ฉันมีใครบางคนบอกฉันว่าคุณไม่ควรใช้async/ awaitในลำดับการทำงานที่สูงขึ้นเช่นนี้ดังนั้นฉันแค่อยากจะถามว่ามันมีปัญหาหรือไม่

21
วิธีการใช้ 'async' และ 'รอ'
จากหนึ่งในความเข้าใจของฉันสิ่งสำคัญที่asyncและawaitทำคือการทำให้รหัสง่ายต่อการเขียนและอ่าน - แต่ใช้พวกเขาเท่ากับวางไข่หัวข้อพื้นหลังเพื่อดำเนินการตรรกะระยะเวลานาน? ฉันกำลังลองตัวอย่างพื้นฐานที่สุด ฉันได้เพิ่มความคิดเห็นบางส่วนแบบอินไลน์ คุณช่วยอธิบายให้ฉันฟังได้ไหม // I don't understand why this method must be marked as `async`. private async void button1_Click(object sender, EventArgs e) { Task<int> access = DoSomethingAsync(); // task independent stuff here // this line is reached after the 5 seconds sleep from // DoSomethingAsync() method. Shouldn't …

16
วิธีการเรียกใช้วิธีการแบบอะซิงโครนัสจากวิธีแบบซิงโครนัสใน C # ได้อย่างไร
ฉันมีpublic async void Foo()วิธีที่ฉันต้องการโทรจากวิธีการซิงโครนัส จนถึงตอนนี้ที่ฉันได้เห็นจากเอกสาร MSDN กำลังเรียกวิธี async ผ่านวิธี async แต่โปรแกรมทั้งหมดของฉันไม่ได้ถูกสร้างขึ้นด้วยวิธี async เป็นไปได้ไหม นี่คือตัวอย่างหนึ่งของการเรียกวิธีการเหล่านี้จากวิธีอะซิงโครนัส: http://msdn.microsoft.com/en-us/library/hh300224(v=vs.110).aspx ตอนนี้ฉันกำลังมองหาวิธีการซิงค์จากวิธีการซิงค์
862 c#  async-await 

24
ฉันจะใช้วิธีการทำงานของ async <T> แบบซิงโครนัสได้อย่างไร
ฉันเรียนรู้เกี่ยวกับ async / คอยและพบกับสถานการณ์ที่ฉันต้องเรียกวิธีการ async พร้อมกัน ฉันจะทำสิ่งนั้นได้อย่างไร วิธีการซิงค์: public async Task&lt;Customers&gt; GetCustomers() { return await Service.GetCustomersAsync(); } การใช้งานปกติ: public async void GetCustomers() { customerList = await GetCustomers(); } ฉันได้ลองใช้สิ่งต่อไปนี้: Task&lt;Customer&gt; task = GetCustomers(); task.Wait() Task&lt;Customer&gt; task = GetCustomers(); task.RunSynchronously(); Task&lt;Customer&gt; task = GetCustomers(); while(task.Status != TaskStatus.RanToCompletion) ฉันลองใช้คำแนะนำจากที่นี่แต่มันไม่ทำงานเมื่อโปรแกรมเลือกจ่ายงานอยู่ในสถานะถูกระงับ public static void …

4
วิธีปฏิบัติที่ดีที่สุดในการโทร ConfigureAwait สำหรับรหัสฝั่งเซิร์ฟเวอร์ทั้งหมด
เมื่อคุณมีรหัสฝั่งเซิร์ฟเวอร์ (เช่นบางส่วนApiController) และฟังก์ชั่นของคุณจะไม่ตรงกัน - เพื่อให้พวกเขากลับมาTask&lt;SomeObject&gt;- มันถือว่าเป็นวิธีที่ดีที่สุดว่าเวลาที่คุณรอคอยฟังก์ชั่นที่คุณโทรหาConfigureAwait(false)? ฉันได้อ่านว่ามันมีประสิทธิภาพมากกว่าเพราะไม่ต้องสลับบริบทของเธรดกลับไปเป็นบริบทของเธรดดั้งเดิม อย่างไรก็ตามด้วย ASP.NET Web Api หากคำขอของคุณเข้ามาในเธรดเดียวและคุณรอฟังก์ชั่นและการโทรConfigureAwait(false)ที่อาจทำให้คุณอยู่ในเธรดอื่นเมื่อคุณส่งคืนผลลัพธ์สุดท้ายของApiControllerฟังก์ชัน ฉันได้พิมพ์ตัวอย่างของสิ่งที่ฉันพูดถึงด้านล่าง: public class CustomerController : ApiController { public async Task&lt;Customer&gt; Get(int id) { // you are on a particular thread here var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false); // now you are on a different thread! will that cause problems? …

6
ไวยากรณ์สำหรับฟังก์ชั่นลูกศร async
ฉันสามารถทำเครื่องหมายฟังก์ชันจาวาสคริปต์เป็น "async" (เช่นคืนสัญญา) ด้วยasyncคำหลัก แบบนี้: async function foo() { // do something } ไวยากรณ์เทียบเท่าสำหรับฟังก์ชั่นลูกศรคืออะไร

9
หากอินเทอร์เฟซของฉันต้องส่งคืนงานเป็นวิธีที่ดีที่สุดในการปรับใช้งานที่ไม่ดำเนินการอย่างไร
ในโค้ดด้านล่างเนื่องจากอินเทอร์เฟซคลาสLazyBarจะต้องส่งคืนภารกิจจากเมธอดของมัน (และสำหรับเหตุผลที่ไม่สามารถเปลี่ยนแปลงได้) หากLazyBarการติดตั้งใช้งานผิดปกติเกิดขึ้นกับการทำงานที่รวดเร็วและพร้อมกัน - วิธีใดที่ดีที่สุดในการส่งคืนภารกิจที่ไม่มีการดำเนินการจากเมธอด? ฉันได้ไปTask.Delay(0)ข้างล่างนี้ แต่ฉันอยากจะรู้ว่าสิ่งนี้มีผลข้างเคียงของการทำงานหรือไม่ถ้าฟังก์ชั่นนี้มีการเรียกใช้มาก (เพื่อประโยชน์ในการโต้แย้งพูดหลายร้อยครั้งต่อวินาที): น้ำตาลซินแทติกติกนี้ไม่ทำให้ลมออกมาเป็นเรื่องใหญ่หรือไม่? มันเริ่มอุดตันกลุ่มแอปพลิเคชันของฉันหรือไม่ คอมไพเลอร์มีดเพียงพอที่จะจัดการกับDelay(0)แตกต่างกันหรือไม่? จะreturn Task.Run(() =&gt; { });แตกต่างกันอย่างไร มีวิธีที่ดีกว่า? using System.Threading.Tasks; namespace MyAsyncTest { internal interface IFooFace { Task WillBeLongRunningAsyncInTheMajorityOfImplementations(); } /// &lt;summary&gt; /// An implementation, that unlike most cases, will not have a long-running /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations' /// &lt;/summary&gt; internal …

5
ใช้ async / รอหลายงาน
ฉันใช้ไคลเอนต์ API ที่ไม่สมบูรณ์อย่างสมบูรณ์นั่นคือการดำเนินการแต่ละอย่างกลับมาTaskหรือTask&lt;T&gt;เช่น: static async Task DoSomething(int siteId, int postId, IBlogClient client) { await client.DeletePost(siteId, postId); // call API client Console.WriteLine("Deleted post {0}.", siteId); } การใช้ตัวดำเนินการ async / await C # 5 วิธีที่ถูกต้อง / มีประสิทธิภาพมากที่สุดในการเริ่มงานหลาย ๆ อย่างและรอให้พวกเขาทั้งหมดดำเนินการให้เสร็จสิ้นคืออะไร: int[] ids = new[] { 1, 2, 3, 4, 5 }; Parallel.ForEach(ids, i …

8
ทำไมฉันไม่สามารถใช้โอเปอเรเตอร์ 'ที่รอ' อยู่ภายในเนื้อความของคำสั่งล็อกได้
ไม่อนุญาตให้ใช้คำสำคัญที่รอใน C # (. NET Async CTP) จากMSDN : ไม่สามารถใช้นิพจน์ที่รออยู่ในฟังก์ชันซิงโครนัสในนิพจน์แบบสอบถามใน catch หรือ block สุดท้ายของคำสั่งการจัดการข้อยกเว้นในบล็อกคำสั่งล็อกหรือในบริบทที่ไม่ปลอดภัย ฉันคิดว่านี่เป็นเรื่องยากหรือเป็นไปไม่ได้สำหรับทีมคอมไพเลอร์ที่จะใช้ด้วยเหตุผลบางอย่าง ฉันพยายามแก้ไขด้วยคำสั่งการใช้: class Async { public static async Task&lt;IDisposable&gt; Lock(object obj) { while (!Monitor.TryEnter(obj)) await TaskEx.Yield(); return new ExitDisposable(obj); } private class ExitDisposable : IDisposable { private readonly object obj; public ExitDisposable(object obj) { this.obj = …
348 c#  .net  async-await 

4
WaitAll vs WhenAll
ความแตกต่างระหว่างTask.WaitAll()และTask.WhenAll()จาก Async CTP คืออะไร? คุณสามารถให้รหัสตัวอย่างเพื่อแสดงกรณีการใช้ที่แตกต่างกันได้หรือไม่?

6
Task.Result เหมือนกับ. GetAwaiter.GetResult () หรือไม่
ฉันเพิ่งอ่านโค้ดที่ใช้วิธีการแบบอะซิงก์จำนวนมาก แต่บางครั้งก็จำเป็นต้องเรียกใช้งานแบบซิงโครนัส รหัสทำ: Foo foo = GetFooAsync(...).GetAwaiter().GetResult(); เป็นเช่นนี้หรือไม่ Foo foo = GetFooAsync(...).Result;
328 c#  async-await 

11
วิธีการโทรอย่างปลอดภัยวิธี async ใน C # โดยไม่ต้องรอ
ฉันมีasyncวิธีการที่ไม่ส่งคืนข้อมูล: public async Task MyAsyncMethod() { // do some stuff async, don't return any data } ฉันกำลังเรียกสิ่งนี้จากวิธีอื่นซึ่งคืนค่าข้อมูลบางอย่าง public string GetStringData() { MyAsyncMethod(); // this generates a warning and swallows exceptions return "hello world"; } การโทรMyAsyncMethod()โดยไม่รอมันทำให้เกิด " เพราะการโทรนี้ไม่รอวิธีการปัจจุบันยังคงทำงานก่อนที่การโทรจะเสร็จสิ้น " เตือนใน visual studio ในหน้าคำเตือนนั้นระบุว่า: คุณควรพิจารณาปราบปรามเตือนเฉพาะถ้าคุณแน่ใจว่าคุณไม่ต้องการที่จะรอให้สายตรงกันที่จะเสร็จสมบูรณ์และว่าวิธีการที่เรียกว่าจะไม่เพิ่มข้อยกเว้นใด ๆ ฉันแน่ใจว่าฉันไม่ต้องการรอให้การโทรเสร็จสมบูรณ์ ฉันไม่ต้องการหรือมีเวลา แต่การโทรอาจเพิ่มข้อยกเว้น ฉันพบปัญหานี้สองสามครั้งและฉันแน่ใจว่าเป็นปัญหาทั่วไปที่ต้องมีวิธีแก้ไขปัญหาร่วมกัน ฉันจะเรียกวิธีการ async …

4
การรอการดำเนินการแบบอะซิงโครนัสพร้อมกันและทำไม Wait () ทำให้โปรแกรมค้างที่นี่
คำนำ : ฉันกำลังมองหาคำอธิบายไม่ใช่แค่ทางออก ฉันรู้วิธีแก้ปัญหาแล้ว แม้ว่าจะใช้เวลาหลายวันในการศึกษาบทความ MSDN เกี่ยวกับ Asynchronous Pattern (TAP) แบบใช้งาน, async และรอฉันยังคงสับสนเล็กน้อยเกี่ยวกับรายละเอียดปลีกย่อยบางส่วน ฉันกำลังเขียนตัวบันทึกสำหรับแอพ Windows Store และฉันต้องการสนับสนุนทั้งการบันทึกแบบอะซิงโครนัสและการซิงโครนัส วิธีการแบบอะซิงโครนัสตาม TAP วิธีการแบบอะซิงโครนัสควรซ่อนทั้งหมดนี้และดูและทำงานเหมือนกับวิธีการทั่วไป นี่คือวิธีการหลักของการบันทึกแบบอะซิงโครนัส: private async Task WriteToLogAsync(string text) { StorageFolder folder = ApplicationData.Current.LocalFolder; StorageFile file = await folder.CreateFileAsync("log.log", CreationCollisionOption.OpenIfExists); await FileIO.AppendTextAsync(file, text, Windows.Storage.Streams.UnicodeEncoding.Utf8); } ตอนนี้วิธีการซิงโครนัสที่สอดคล้องกัน ... รุ่น 1 : private void WriteToLog(string …

2
เมื่อใช้ Task.Run อย่างถูกต้องและเมื่อรอเพียง async
Task.Runผมอยากจะขอให้คุณอยู่กับความเห็นของคุณเกี่ยวกับสถาปัตยกรรมที่ถูกต้องเมื่อใช้ ฉันกำลังประสบกับความล้าหลัง UI ในแอปพลิเคชัน WPF .NET 4.5 ของเรา (ด้วยกรอบ Caliburn Micro) โดยทั่วไปฉันกำลังทำ (ตัวอย่างโค้ดที่ง่ายมาก): public class PageViewModel : IHandle&lt;SomeMessage&gt; { ... public async void Handle(SomeMessage message) { ShowLoadingAnimation(); // Makes UI very laggy, but still not dead await this.contentLoader.LoadContentAsync(); HideLoadingAnimation(); } } public class ContentLoader { public async Task LoadContentAsync() { …

6
HttpClient.GetAsync (…) จะไม่กลับมาเมื่อใช้ await / async
แก้ไข: คำถามนี้ดูเหมือนว่าอาจเป็นปัญหาเดียวกัน แต่ไม่มีคำตอบ ... แก้ไข:ในกรณีทดสอบ 5 งานดูเหมือนจะติดอยู่ในWaitingForActivationสถานะ ฉันพบพฤติกรรมแปลก ๆ บางอย่างโดยใช้ System.Net.Http.HttpClient ใน. NET 4.5 - ที่ "รอ" ผลการโทรไปที่ (เช่น) httpClient.GetAsync(...)จะไม่กลับมา สิ่งนี้จะเกิดขึ้นในบางสถานการณ์เมื่อใช้ฟังก์ชันการทำงานของ async / await ใหม่และ Tasks API - รหัสดูเหมือนจะทำงานเมื่อใช้ต่อเนื่องเท่านั้น นี่คือโค้ดบางส่วนที่ทำให้เกิดปัญหาอีกครั้ง - วางสิ่งนี้ลงใน "MVC 4 WebApi โครงการใหม่" ใน Visual Studio 11 เพื่อแสดงปลายทาง GET ต่อไปนี้: /api/test1 /api/test2 /api/test3 /api/test4 /api/test5 &lt;--- never …

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