ฉันมีรหัสทดสอบ 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 == null)
{
// thrown
throw new ArgumentException("HttpContext.Current is null");
}
return "value";
}
ฉันเชื่อในที่นี้ว่าข้อยกเว้นที่สองคาดว่าจะเกิดขึ้นเนื่องจากเมื่อการawait
ดำเนินการเสร็จสมบูรณ์มีแนวโน้มว่าจะอยู่ในเธรดอื่นโดยที่HttpContext.Current
ตัวแปรคงเธรดจะไม่สามารถแก้ไขเป็นค่าที่เหมาะสมได้อีกต่อไป ตอนนี้ตามบริบทการซิงโครไนซ์อาจถูกบังคับให้กลับไปที่เธรดเดิมหลังจากรอ แต่ฉันไม่ได้ทำอะไรที่น่าสนใจในการทดสอบของฉัน นี่เป็นเพียงการใช้งานแบบไร้เดียงสาธรรมดาawait
ๆ
ในความคิดเห็นในคำถามอื่นฉันได้รับคำสั่งว่าHttpContext.Current
ควรแก้ไขหลังจากรอ ยังมีความคิดเห็นอื่น ๆ ในคำถามนี้ที่ระบุว่าเหมือนกัน แล้วอะไรจริง? ควรแก้ไขหรือไม่? ฉันคิดว่าไม่ แต่ฉันต้องการคำตอบที่เชื่อถือได้สำหรับเรื่องนี้เพราะasync
และawait
ใหม่พอที่ฉันไม่สามารถหาข้อสรุปที่ชัดเจนได้
TL; DR: HttpContext.Current
อาจnull
เป็นหลังจากawait
?