ฉันจะใช้ส่วนฝั่งเซิร์ฟเวอร์ C # ของการโพลแบบยาวสำหรับคำขอ ajax ได้อย่างไร

ฉันมีสถาปัตยกรรมที่เกี่ยวข้องกับเบราว์เซอร์ที่สำรวจผ่าน ajax ทุก 3 วินาทีสำหรับการอัปเดต และฉันต้องการเปลี่ยนเป็น การโพลแบบยาว

ฉันต้องการให้ลูกค้า 1, 2.. {n} รายทำการโพลแบบยาว รอการอัปเดต และมีบางอย่างเกิดขึ้นบนเซิร์ฟเวอร์เพื่อส่งสัญญาณให้ลูกค้าที่รอกลับมา ความคิดแรกของฉันคือการใช้ EventWaitHandle และ ฉันสามารถทำสิ่งนี้ได้อย่างง่ายดายหากฉันต้องการสนับสนุนลูกค้า 1 ราย ฉันแค่มี AutoResetEvent WaitHandle ที่จะ WaitOne เพื่อบล็อกไคลเอ็นต์ อาจมีการหมดเวลา หรืออาจจะไม่ ไม่ว่าจะด้วยวิธีใด AutoResetEvent จะอนุญาตให้ฉันรองรับไคลเอนต์ได้เพียง 1 ตัวเท่านั้น (เนื่องจากมันปลุกได้เพียง 1 เธรดที่รออยู่) และฉันต้องการไคลเอนต์ n ตัว

ฉันค่อนข้างแน่ใจว่าฉันจำเป็นต้องใช้ ManualResetEvent WaitHandle แต่ฉันไม่แน่ใจว่าเมื่อใดจะโทร Reset หลังจากฉัน Set มัน (เมื่อปลุกเธรด) ฉันควร Thread.Sleep จำนวนที่ต้องการอยู่ระหว่าง Set และ Reset?

ในรหัสหลอก ตรรกะการตื่นจะเป็น

  • รับ ManualResetEventWaitHandle
  • โทร Set
  • ตรวจสอบให้แน่ใจว่าลูกค้าที่รออยู่ทั้งหมดได้ตื่นขึ้นแล้ว พร้อมทั้งป้องกันไม่ให้คำขอใหม่ส่งผ่าน
  • โทร Reset ตอนนี้ลูกค้าที่รออยู่ทั้งหมดได้รับการอัปเดตแล้ว

มันเป็นบรรทัดที่ 3 ที่ฉันลำบากด้วย ขณะนี้ฉันกำลังคิดถึงแนวคิดที่จะมี LastTxID ที่ไคลเอ็นต์ / เซิร์ฟเวอร์ดูแลรักษาและอาจใช้ตัวจัดการรอ 2 ตัว อย่างไรก็ตาม ก่อนที่ฉันจะคลั่งไคล้การติดตั้งใช้งานนี้ ฉันต้องการรับคำติชมที่นี่เพื่อดูว่าพวกเขาจะนำตรรกะการตื่นไปใช้อย่างไร

แก้ไข: สมมติว่าฉันมีปัญหาที่เกี่ยวข้องกับการมีผู้ใช้พร้อมกันสูงสุดที่คิดออก ไม่ว่าจะโดยการปรับแต่ง IIS หรือโฮสต์ผ่าน WCF หรือวิธีแก้ไขปัญหาอื่น ๆ ฉันแค่อยากจะมุ่งเน้นไปที่ตรรกะของการตื่นเท่านั้น


person Allen Rice    schedule 28.04.2010    source แหล่งที่มา
comment
ตรวจสอบสิ่งนี้สำหรับการใช้งานที่ใช้งานได้: msdn.microsoft.com/en-us/ ไลบรารี/aa446486.aspx   -  person sabbour    schedule 27.05.2010
comment
โปรดทราบว่าสิ่งนี้ล้าสมัยแล้ว และควรใช้ SignalR สำหรับงานประเภทนี้ในตอนนี้   -  person Allen Rice    schedule 13.11.2013


คำตอบ (1)


แนวคิดหนึ่ง ในรหัสเทียม

  • รักษารายการรหัสการเชื่อมต่อที่ปลอดภัยสำหรับเธรด ซึ่งอาจใช้รหัสเซสชัน
  • ให้ทุกการเชื่อมต่อเป็นของตัวเอง AutoResetEventWaitHandle
  • ในลักษณะที่ปลอดภัยสำหรับเธรด ให้วนซ้ำจุดจับการรอเหล่านั้น และตั้งค่าเมื่อมีการอัปเดต
  • เมื่อสิ้นสุดเซสชัน ในลักษณะที่ปลอดภัยของเธรด ให้ลบการเชื่อมต่อ / รหัสเซสชันนั้นออกจากรายการ

ฉันชอบที่จะได้รับข้อเสนอแนะเกี่ยวกับเรื่องนี้

ขัดแย้งกับแนวทางนี้

  • ต้องรักษารายการการเชื่อมต่อ
  • ต้องสร้างตัวจัดการการรอ {n} สำหรับไคลเอนต์ {n}
person Allen Rice    schedule 28.04.2010