การใช้คำต่อท้าย "Async" ในชื่อเมธอดนั้นขึ้นอยู่กับว่าใช้ตัวแก้ไข "async" หรือไม่


108

หลักการสำหรับการต่อท้ายชื่อเมธอดด้วย "Async" คืออะไร?

คำต่อท้าย "Async" ควรต่อท้ายเฉพาะเมธอดที่ประกาศด้วยasyncตัวปรับแต่งหรือไม่

public async Task<bool> ConnectAsync()

หรือเพียงพอที่วิธีการคืนค่าTask<T>หรือTask?

public Task<bool> ConnectAsync()

4
สำหรับส่วนการตั้งชื่อTAP docกล่าวว่า: วิธีการแบบอะซิงโครนัสใน TAP จะรวมคำต่อท้าย Async ไว้หลังชื่อการดำเนินการ ตัวอย่างเช่น GetAsync สำหรับการดำเนินการรับ หากคุณกำลังเพิ่มเมธอด TAP ไปยังคลาสที่มีชื่อเมธอดนั้นพร้อมคำต่อท้าย Async อยู่แล้วให้ใช้ TaskAsync ต่อท้ายแทน ตัวอย่างเช่นถ้าคลาสมีเมธอด GetAsync อยู่แล้วให้ใช้ชื่อ GetTaskAsync
James Manning

4
โอเคฉันเดาว่าฉันสับสนกับชื่อคำถามที่ว่า "การตั้งชื่อแบบแผนสำหรับวิธีการ async"
James Manning

1
นี่เป็นคำถามที่สร้างได้ไม่ดี ผู้คนทะเลาะกันคำตอบที่เท่าเทียมกัน
Luke Puplett

4
เนื่องจากหลายคนเข้าใจผิดและกำลังโต้เถียงกับสิ่งที่ถามจริงสงสัยว่าคำถามสองส่วนเป็นต้นข้อพิสูจน์ที่ทำให้สับสนก็คือผู้คนสับสน
Luke Puplett

2
@DavidRR จนถึงทุกวันนี้ฉันยังไม่เข้าใจความสับสนที่เกิดขึ้นกับคำถามนี้ หากการแก้ไขของคุณทำให้เกิดความสับสนจนสามารถช่วยคุณได้และอาจช่วยผู้อื่นได้เรายินดีให้การแก้ไขของคุณได้รับบางสิ่งที่ฉันไม่สามารถทำได้ในสูตรดั้งเดิม ตอนนี้คำถามเก่ามากจนแทบจำความคิดของตัวเองไม่ได้เมื่อถามที่นี่ดังนั้นเจตนาดั้งเดิมจึงมีความสำคัญน้อยลง คำตอบของลุคสะท้อนให้เห็นว่าไม่ใช่ทุกคนที่สับสน ฉันพบว่ามันมีประโยชน์อย่างมาก
kasperhj

คำตอบ:


130

ฉันคิดว่าความจริงคลุมเครือแม้จากเอกสารของ Microsoft:

ใน Visual Studio 2012 และ. NET Framework 4.5 วิธีการใด ๆ ที่ประกอบด้วยasyncคีย์เวิร์ด ( Asyncใน Visual Basic) ถือเป็นวิธีการแบบอะซิงโครนัสและคอมไพเลอร์ C # และ Visual Basic จะทำการแปลงที่จำเป็นเพื่อใช้วิธีการแบบอะซิงโครนัสโดยใช้ TAP วิธีการอะซิงโครนัสควรส่งคืนวัตถุTaskหรือTask<TResult>วัตถุ

http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx

ไม่ถูกต้องอยู่แล้ว วิธีการใด ๆ ที่มีasyncเป็นแบบอะซิงโครนัสจากนั้นจึงบอกว่าควรส่งคืน a TaskหรือTask<T>- ซึ่งไม่ถูกต้องสำหรับวิธีการที่ด้านบนของ call stack, Button_Click เป็นต้นหรือasync void.

แน่นอนคุณต้องพิจารณาว่าอะไรคือจุดสำคัญของการประชุมใหญ่?

คุณสามารถพูดได้ว่าหลักการAsyncต่อท้ายคือการสื่อสารกับผู้ใช้ API ว่าวิธีนี้รออยู่ สำหรับวิธีการที่จะ awaitable ก็ต้องกลับTaskสำหรับเป็นโมฆะหรือTask<T>หาวิธีการที่คุ้มค่ากลับมาซึ่งหมายความว่าเพียงหลังสามารถ suffixed Asyncกับ

หรือคุณอาจพูดได้ว่าหลักการAsyncต่อท้ายคือการสื่อสารว่าเมธอดสามารถคืนค่าได้ทันทีโดยปล่อยเธรดปัจจุบันเพื่อทำงานอื่นและอาจทำให้เกิดการแข่งขัน

คำพูดของ Microsoft doc นี้กล่าวว่า:

ตามแบบแผนคุณต้องต่อท้าย "Async" ต่อท้ายชื่อของวิธีการที่มีตัวปรับเปลี่ยน Async หรือ async

http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention

ซึ่งไม่ได้พูดถึงว่าวิธีการแบบอะซิงโครนัสของคุณกลับมานั้นTaskต้องการAsyncคำต่อท้ายซึ่งฉันคิดว่าเราทุกคนเห็นด้วย


ดังนั้นคำตอบสำหรับคำถามนี้อาจเป็นได้ทั้งสองอย่าง ในทั้งสองกรณีที่คุณจำเป็นต้องผนวกAsyncกับวิธีการที่มีasyncคำหลักและผลตอบแทนที่หรือTaskTask<T>


ฉันจะขอให้ Stephen Toub ชี้แจงสถานการณ์

อัปเดต

ดังนั้นฉันจึงทำ และนี่คือสิ่งที่คนดีของเราเขียน:

หากเมธอดสาธารณะคือการส่งคืนงานและเป็นแบบอะซิงโครนัส (ตรงข้ามกับวิธีการที่ทราบว่าจะดำเนินการพร้อมกันเพื่อให้เสร็จสมบูรณ์เสมอ แต่ยังคงส่งคืนงานด้วยเหตุผลบางประการ) ก็ควรมีคำต่อท้าย“ Async” นั่นคือแนวทาง เป้าหมายหลักในการตั้งชื่อนี้คือการทำให้ผู้บริโภคเห็นได้ชัดถึงฟังก์ชันการทำงานที่ว่าวิธีการที่เรียกใช้อาจจะไม่ทำงานทั้งหมดพร้อมกัน แน่นอนว่ายังช่วยในกรณีที่มีการเปิดเผยฟังก์ชันการทำงานด้วยวิธีการซิงโครนัสและอะซิงโครนัสเช่นนั้นคุณต้องมีความแตกต่างของชื่อเพื่อแยกความแตกต่าง วิธีการบรรลุการใช้งานแบบอะซิงโครนัสนั้นไม่มีความสำคัญต่อการตั้งชื่อ: ไม่ว่าจะใช้ async / await เพื่อรวบรวมความช่วยเหลือของคอมไพเลอร์หรือว่าประเภทและวิธีการจาก System.Threading งานถูกใช้โดยตรง (e. ก. TaskCompletionSource) ไม่สำคัญนักเนื่องจากจะไม่ส่งผลกระทบต่อลายเซ็นของวิธีการเท่าที่ผู้บริโภคใช้วิธีนี้เกี่ยวข้อง

แน่นอนว่ามีข้อยกเว้นเสมอสำหรับแนวทางปฏิบัติ สิ่งที่น่าสังเกตมากที่สุดในกรณีของการตั้งชื่อคือกรณีที่ raison d'etre ทั้งประเภทให้ฟังก์ชันการทำงานที่เน้น async ซึ่งในกรณีนี้การมี Async ในทุกวิธีจะเป็นการใช้งานมากเกินไปเช่นวิธีการใน Task ที่สร้าง Tasks อื่น ๆ .

สำหรับวิธีการแบบอะซิงโครนัสที่คืนค่าเป็นโมฆะไม่พึงปรารถนาที่จะมีวิธีการดังกล่าวในพื้นที่สาธารณะเนื่องจากผู้เรียกไม่มีวิธีที่ดีในการรู้ว่างานอะซิงโครนัสเสร็จสิ้นเมื่อใด หากคุณต้องเปิดเผยวิธีการอะซิงโครนัสที่คืนค่าเป็นโมฆะต่อสาธารณะคุณน่าจะต้องการมีชื่อที่บ่งบอกว่างานอะซิงโครนัสกำลังเริ่มต้นขึ้นและคุณสามารถใช้คำต่อท้าย“ Async” ที่นี่ได้หากเหมาะสม เมื่อพิจารณาถึงความยากของกรณีนี้ฉันขอยืนยันว่ามันเป็นการตัดสินใจแบบเคสต่อกรณี

ฉันหวังว่าจะช่วยได้สตีฟ

คำแนะนำสั้น ๆ จากประโยคเปิดของ Stephen นั้นชัดเจนเพียงพอ ไม่รวมasync voidเนื่องจากเป็นเรื่องผิดปกติที่ต้องการสร้าง API สาธารณะด้วยการออกแบบดังกล่าวเนื่องจากวิธีที่ถูกต้องในการใช้โมฆะอะซิงโครนัสคือการส่งคืนTaskอินสแตนซ์ธรรมดาและปล่อยให้คอมไพเลอร์ใช้เวทมนตร์ อย่างไรก็ตามหากคุณต้องการขอแนะนำให้public async voidต่อท้าย Asyncวิธีการด้านบนของสแต็กasync voidอื่น ๆ เช่นตัวจัดการเหตุการณ์มักจะไม่เป็นสาธารณะและไม่สำคัญ / มีคุณสมบัติ

สำหรับผมมันบอกว่าถ้าฉันพบตัวเองสงสัยเกี่ยวกับ suffixing Asyncบนasync voidผมอาจจะเปิดเป็นเพื่อให้สายที่สามารถรอมันแล้วผนวกasync TaskAsync


20
น่าเสียดายที่เราไม่มีเวลารวบรวมการตรวจสอบการเรียกใช้เมธอด .. เดี๋ยวก่อน ถ้าผมตั้งชื่อวิธีการรับหรือGetAsyncและไม่ได้ใช้รอคอยจากด้านข้างโทรที่รวบรวมจะล้มเหลวในการสร้าง ดังนั้นการประชุมนี้จึงไม่ปลอดภัยและขัดต่อแนวทางของ Microsoft Style หลายประการเช่นการหลีกเลี่ยงสิ่งต่างๆเช่นPersonStringหรือPriceDecimalเหตุใดจึงต้องใช้GetAsync- ผู้บริโภค API ของ async API ไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้เนื่องจากคำขอจะส่งคืนเสมอหลังจากงานทั้งหมดเสร็จสมบูรณ์แล้ว มันโง่และน่ารำคาญจริงๆ แต่เป็นเพียงการประชุมอื่นที่ไม่มีใครรู้ว่าทำไมจึงอยู่ที่นั่น
Piotr Kula

2
@ppumkin: ดังที่ Stephen ชี้ให้เห็นว่าวิธีการสามารถเป็นแบบอะซิงโครนัสได้อย่างง่ายดายโดยไม่ต้องใช้ async / await ดังนั้นผู้โทรจึงไม่มีข้อบ่งชี้อื่นใดนอกจากชื่อว่าฟังก์ชันทำงานแบบอะซิงโครนัสหรือไม่
Hannobo

6
@ppumkin: ความล้มเหลวในการรอเมธอด async โดยค่าเริ่มต้นจะส่งผลให้มีคำเตือนเวลาคอมไพล์ ไม่ใช่ข้อผิดพลาดในการสร้าง
Dustin Cleveland

8
ฉันคิดว่าการประชุมนี้โง่ มีการบ่งชี้อัตโนมัติสามวิธีที่แสดงว่าเมธอดคือ async: 1. ประเภทการส่งคืนคืองาน 2. การเติมโค้ดให้เสร็จสิ้นแสดงคำใบ้ที่รอคอยได้ 3. IDE จะเตือนคุณโดยขีดเส้นใต้เป็นสีเขียวและแสดงคำเตือนของคอมไพเลอร์ ดังนั้นฉันจึงเห็นด้วยกับ @ppumkin โดยสิ้นเชิง คำต่อท้าย Async นั้นไร้สาระราวกับว่าคุณเขียนพร็อพเพอร์ตี้เช่นนั้น: Public Lazy <ลูกค้า> CustomerLazy ใครจะทำ! ??
Marco

2
@Marco ฉันหยิบยกความคิดนี้ใน GitHub คิดว่าเป็นสถานที่ที่ดีที่สุด แต่ไม่มีส่วนร่วมกับมันฉันคิดว่าฉันจะได้รับ: github.com/dotnet/core/issues/1464
Luke Puplett

71

ฉันสร้างบริการ API จำนวนมากและแอปพลิเคชันอื่น ๆ ที่เรียกระบบอื่น ๆ ซึ่งโค้ดส่วนใหญ่ของฉันทำงานแบบอะซิงโครนัส

กฎทั่วไปของฉันที่ฉันติดตามคือ:

หากมีทั้งวิธีที่ไม่ใช่ async และ async ที่ส่งคืนสิ่งเดียวกันฉันต่อท้าย async ด้วย Async มิฉะนั้นจะไม่

ตัวอย่าง:

วิธีเดียวเท่านั้น:

public async Task<User> GetUser() { [...] }

วิธีเดียวกันกับสองลายเซ็น:

public User GetUser() { [...] }

public async Task<User> GetUserAsync() { [...] }

สิ่งนี้สมเหตุสมผลเนื่องจากเป็นข้อมูลเดียวกันกับที่ส่งคืน แต่สิ่งเดียวที่แตกต่างคือวิธีการส่งคืนข้อมูลไม่ใช่ข้อมูลเอง

ฉันยังคิดว่ารูปแบบการตั้งชื่อนี้มีอยู่เนื่องจากความจำเป็นในการแนะนำวิธีการ async และยังคงรักษาความเข้ากันได้แบบย้อนหลัง

ฉันยืนยันว่ารหัสใหม่ไม่ควรใช้คำต่อท้าย Async เป็นที่ชัดเจนพอ ๆ กับประเภทการส่งคืนของ String หรือ Int ตามที่กล่าวไว้ก่อนหน้านี้ในเธรดนี้


8
ฉันเห็นด้วยโดยเฉพาะอย่างยิ่งว่าโดยปกติคุณต้องไป 'async ตลอดทาง' ซึ่งในกรณีนี้คำต่อท้ายจะซ้ำซ้อน - อะไรคือจุดที่ต้องต่อท้ายเป็น 90% ของรหัส;)
Bartosz

3
นี่คือทางออกที่ดีที่สุด โดยไม่ได้สังเกตเลยฉันก็ทำแบบเดียวกันกับ API ของฉัน
Marco

2
วิธีนี้ดีกว่าการต่อท้ายด้วย "Async" ทุกวิธีในการสมัคร async
Mariusz Jamro

ปัญหาของเทคนิคนี้คือถ้าคุณสร้างเวอร์ชันที่ไม่ใช่ async ในภายหลังคุณจะไม่สามารถใช้ชื่อ "GetUser ()" ที่คุณต้องการได้
David

3
นี่เป็นวิธีปฏิบัติที่ควรทำ การผนวก Async กับทุกวิธีที่มีตัวปรับเปลี่ยน async นั้นเป็นเพียงแค่สัญลักษณ์ฮังการี 2019 @David หากคุณเพิ่มเวอร์ชันที่ไม่ใช่ async ในภายหลังให้เปลี่ยนชื่อวิธีการและทำตามหลักการตั้งชื่อหรืออย่าทำอย่างนั้น
Skrymsli

25

หลักการสำหรับการต่อท้ายชื่อเมธอดด้วย "Async" คืออะไร

แบบงานตามแบบ Asynchronous (TAP)สั่งการว่าวิธีการควรกลับTask<T>(หรือTask) และได้รับการตั้งชื่อที่มีAsyncต่อท้าย; asyncนี้จะแยกจากการใช้งานของ ทั้งสองTask<bool> Connect()และจะคอมไพล์และรันได้ดี แต่คุณจะไม่ปฏิบัติตามหลักการตั้งชื่อ TAPasyncTask<bool> Connect()

วิธีนี้ควรมีasyncตัวปรับแต่งหรือไม่หรือเพียงพอที่จะส่งคืนงาน

หากเนื้อหาของวิธีการ (โดยไม่คำนึงถึงประเภทการส่งคืนหรือชื่อ) รวมอยู่awaitด้วยคุณต้องใช้async; และคอมไพเลอร์จะแจ้งให้คุณทราบว่า "ตัวดำเนินการ 'await' สามารถใช้ได้ภายในเมธอด async เท่านั้น ... " กลับมาTask<T>หรือTaskไม่ "พอ" asyncที่จะหลีกเลี่ยงการใช้ ดูasync (อ้างอิง C #)สำหรับรายละเอียด

ลายเซ็นใดต่อไปนี้ถูกต้อง:

ทั้งสองและปฏิบัติตามอนุสัญญา TAP อย่างถูกต้อง คุณสามารถเสมอใช้คำหลัก แต่คุณจะได้รับการเตือนคอมไพเลอร์ "วิธีการ async นี้ขาด 'รอคอย' ผู้ประกอบการและจะทำงานพร้อมกัน ... ." ถ้าร่างกายไม่ได้ใช้asyncTask<bool> ConnectAsync()Task<bool> ConnectAsync()asyncawait


1
เขาหมายถึงว่าคุณต่อท้าย "Async" เข้ากับชื่อเมธอดหรือไม่ไม่ใช่ว่าคุณใช้asyncคีย์เวิร์ด
Servy

1
@Servy wether หรือไม่ใช้คีย์เวิร์ดasyncเป็นส่วนที่สองของคำถาม
Corak

2
@Servy เป็นคำถามสองส่วน ส่วนแรกอย่างที่บอกคือจะต่อท้าย "Async" เข้ากับชื่อเมธอดหรือไม่ ส่วนที่สองคือการใช้asyncตัวปรับแต่งหรือไม่ ดูตัวอย่าง OPs public async Task<bool> ConnectAsync()ด้วย (พร้อมasyncตัวปรับแต่ง) เทียบกับpublic Task<bool> ConnectAsync()(ไม่มีasyncตัวปรับแต่ง) ชื่อเมธอดมีคำต่อท้าย "Async" ในทั้งสองกรณี
Corak

2
มันเป็นไม่ได้เป็นคำถามที่สองส่วน คำถามคือควรจะ "Async" ต่อท้ายชื่อวิธีการของวิธีการที่ผลตอบแทนหรือวิธีการที่มีTask async Task
kasperhj

3
@lejon: คุณควรปรับปรุงคำถาม; "เทียบกับ" ข้อมูลโค้ดทำให้ชัดเจนว่าคำถาม (อย่างครบถ้วน) เป็นเรื่องเกี่ยวกับ async เนื่องจากเป็นข้อแตกต่างเพียงอย่างเดียว

11

หรือเพียงพอที่จะส่งคืนงาน?

ที่. asyncคำหลักไม่ได้เป็นปัญหาจริงที่นี่ หากคุณใช้อะซิงโครไนซ์โดยไม่ใช้asyncคีย์เวิร์ดเมธอดยังคงเป็น "Async" ตามความหมายทั่วไป


7

เนื่องจากTaskและTask<T>เป็นประเภทที่รอคอยได้ทั้งสองประเภทจึงแสดงถึงการดำเนินการแบบอะซิงโครนัสบางอย่าง หรืออย่างน้อยก็ควรเป็นตัวแทน

คุณควรเพิ่มคำต่อท้ายAsyncลงในเมธอดซึ่งในบางกรณี (ไม่จำเป็นต้องเป็นทั้งหมด) จะไม่ส่งคืนค่า แต่จะส่งกลับ wrapper รอบการดำเนินการที่กำลังดำเนินอยู่ กระดาษห่อนั้นมักจะเป็น a Taskแต่ใน Windows RT สามารถเป็นIAsyncInfoได้ ปฏิบัติตามความรู้สึกของคุณและจำไว้ว่าหากผู้ใช้รหัสของคุณเห็นAsyncฟังก์ชันนั้นเขาหรือเธอจะรู้ว่าการเรียกใช้วิธีนั้นแยกออกจากผลลัพธ์ของวิธีการนั้นและพวกเขาจำเป็นต้องดำเนินการตามนั้น

โปรดทราบว่ามีวิธีการเช่นTask.DelayและTask.WhenAllที่ส่งคืนTaskแต่ยังไม่มีAsyncคำต่อท้าย

นอกจากนี้โปรดทราบว่ามีasync voidวิธีการที่แสดงถึงไฟและลืมวิธีการอะซิงโครนัสและคุณควรตระหนักดีกว่าว่าวิธีนี้ถูกสร้างขึ้นในลักษณะดังกล่าว


6

ฉันจะโต้แย้งว่าควรใช้ Async-ต่อท้ายหากส่งคืนงานไม่ว่าจะประกาศเมธอดด้วยasyncตัวปรับแต่งหรือไม่ก็ตาม

เหตุผลเบื้องหลังคือการประกาศชื่อในอินเทอร์เฟซ อินเทอร์เฟซประกาศประเภทการส่งคืนซึ่งเป็นไฟล์Task. จากนั้นมีการใช้งานอินเทอร์เฟซนั้นสองแบบการใช้งานหนึ่งใช้งานโดยใช้asyncตัวปรับแต่งส่วนอีกตัวไม่ใช้

public interface IFoo
{
    Task FooAsync();
}

public class FooA : IFoo
{
    public Task FooAsync() { /* ... */ }
}

public class FooB : IFoo
{
    public async Task FooAsync() { /* ... */ }
}

นี่เป็นเรื่องจริง เราใช้อินเทอร์เฟซทุกที่ทุกเวลาและไม่สามารถประกาศอินเทอร์เฟซแบบ async ได้ ดังนั้นคำแนะนำอย่างเป็นทางการเกี่ยวกับการใช้คำต่อท้าย Async จึงดูไร้สาระสำหรับฉัน ฉันคิดว่าคำหลัก async เป็นเพียงรายละเอียดการนำไปใช้งานซึ่งเป็นส่วนหนึ่งของภายในของวิธีการและไม่ควรมีอิทธิพลต่อชื่อหรือสิ่งใดก็ตามจากภายนอก
Al Kepp

5

ในการเขียนโปรแกรมแบบอะซิงโครนัสกับ async และ await (C #) Microsoft เสนอคำแนะนำต่อไปนี้:

อนุสัญญาการตั้งชื่อ

ตามแบบทั่วไปคุณจะเพิ่ม "Async" ต่อท้ายชื่อของวิธีการที่มี ตัวปรับเปลี่ยนasync

คุณสามารถเพิกเฉยต่อการประชุมที่เหตุการณ์คลาสฐานหรือสัญญาอินเทอร์เฟซแนะนำชื่ออื่น ตัวอย่างเช่นคุณไม่ควรเปลี่ยนชื่อตัวจัดการเหตุการณ์ทั่วไปเช่นButton1_Click.

ฉันพบว่าคำแนะนำนี้ไม่สมบูรณ์และไม่น่าพอใจ หมายความว่าในกรณีที่ไม่มีasyncตัวปรับเปลี่ยนควรตั้งชื่อเมธอดนี้ConnectแทนConnectAsync?

public Task<bool> ConnectAsync()
{
    return ConnectAsyncInternal();
}

ฉันไม่คิดอย่างนั้น ตามที่ระบุไว้ในคำตอบที่กระชับโดย@Servyและคำตอบที่ละเอียดยิ่งขึ้นโดย@Luke Puplettฉันเชื่อว่าเหมาะสมและคาดว่าควรตั้งชื่อเมธอดนี้อย่างแน่นอนConnectAsync(เพราะส่งคืนค่าที่รอคอยได้) ในการสนับสนุนเพิ่มเติมเกี่ยวกับสิ่งนี้@John Skeetในคำตอบสำหรับคำถามอื่นนี้จะต่อท้ายAsyncชื่อวิธีการโดยไม่คำนึงถึงการมีตัวasyncปรับเปลี่ยน

สุดท้ายสำหรับคำถามอื่นให้พิจารณาความคิดเห็นนี้โดย@Damien_The_Unbeliever :

async/awaitเป็นรายละเอียดการใช้งานวิธีการของคุณ ไม่ใช่เรื่องสำคัญว่าจะมีการประกาศวิธีการของคุณasync Task Method()หรือไม่Task Method()ก็ตามตราบเท่าที่ผู้โทรของคุณกังวล (อันที่จริงคุณมีอิสระที่จะเปลี่ยนแปลงระหว่างสองสิ่งนี้ในเวลาต่อมาโดยไม่ถือว่าเป็นการเปลี่ยนแปลงที่แตกหัก)

จากนั้นฉันสรุปได้ว่าเป็นลักษณะอะซิงโครนัสของวิธีการที่กำหนดว่าควรตั้งชื่ออย่างไร ผู้ใช้วิธีนี้จะไม่ทราบด้วยซ้ำว่าasyncมีการใช้ตัวปรับแต่งในการนำไปใช้งาน (โดยไม่มีซอร์สโค้ด C # หรือ CIL)

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