เมื่อคุณมีรหัสฝั่งเซิร์ฟเวอร์ (เช่นบางส่วนApiController
) และฟังก์ชั่นของคุณจะไม่ตรงกัน - เพื่อให้พวกเขากลับมาTask<SomeObject>
- มันถือว่าเป็นวิธีที่ดีที่สุดว่าเวลาที่คุณรอคอยฟังก์ชั่นที่คุณโทรหาConfigureAwait(false)
?
ฉันได้อ่านว่ามันมีประสิทธิภาพมากกว่าเพราะไม่ต้องสลับบริบทของเธรดกลับไปเป็นบริบทของเธรดดั้งเดิม อย่างไรก็ตามด้วย ASP.NET Web Api หากคำขอของคุณเข้ามาในเธรดเดียวและคุณรอฟังก์ชั่นและการโทรConfigureAwait(false)
ที่อาจทำให้คุณอยู่ในเธรดอื่นเมื่อคุณส่งคืนผลลัพธ์สุดท้ายของApiController
ฟังก์ชัน
ฉันได้พิมพ์ตัวอย่างของสิ่งที่ฉันพูดถึงด้านล่าง:
public class CustomerController : ApiController
{
public async Task<Customer> 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?
return customer;
}
}
HttpContext.Current
จะไหลโดย ASP.NETSynchronizationContext
ซึ่งจะไหลออกมาโดยค่าเริ่มต้นเมื่อคุณแต่มันไม่ได้ไหลออกมาโดยawait
ContinueWith
OTOH บริบทการดำเนินการ (รวมถึงข้อ จำกัด ด้านความปลอดภัย) เป็นบริบทที่กล่าวถึงใน CLR ผ่านทาง C # และมีการไหลโดยทั้งสองContinueWith
และawait
(แม้ว่าคุณจะใช้ConfigureAwait(false)
)