ฉันมีแอปพลิเคชันขนาดเล็กที่ต้องทดสอบสตริงการเชื่อมต่อ SQL สำหรับการเชื่อมต่อจำนวนหนึ่ง (ทำทีละครั้ง) ในการดำเนินการนี้ ฉันตั้งค่า ConnectionTimeout = 5
ชั่วคราวเพื่อหลีกเลี่ยงการรอนานหากการเชื่อมต่อไม่ถูกต้อง และ ConnectionTimeout = 0
(รอตลอดไป) พูด
เพื่อหลีกเลี่ยงไม่ให้ UI หยุดทำงานในขณะที่เราพยายาม Open()
การเชื่อมต่อที่ไม่ดี (แม้ว่า ConnectionTimeout = 5
จะต้องรอ SqlException
นานถึงยี่สิบวินาทีก็ตาม) ฉันต้องการรันการทดสอบบนเธรดแยกต่างหากโดยใช้ Task Parallel Library (TPL) ดังนั้นฉันจึงแยกกระทู้ใหม่ของฉันดังนี้:
Task<bool> asyncTestConn = Task.Factory.StartNew<bool>
(() => TestConnection(conn, bShowErrMsg));
return asyncTestConn.Result;
ปัญหาคือมันยังคงล็อค UI (ชัดเจน) เนื่องจากกำลังรอผลลัพธ์ก่อนที่จะกลับไปหาผู้โทร ฉันจะอนุญาตให้โค้ดคืนการควบคุมไปยัง UI (เพิ่ม GUI) ในขณะที่รับผลลัพธ์ในที่สุดจากอะซิงโครนัส Task
ได้อย่างไร
นอกจากนี้ จากภายใน Task
ฉันสามารถดำเนินการ MessageBox.Show("Some message")
ได้อย่างถูกต้องตามกฎหมายหรือไม่ สิ่งนี้ใช้ไม่ได้กับ BackgroundWorkers
และเธรดที่รวมกลุ่มนี้เป็นเธรดพื้นหลังตามค่าเริ่มต้น แต่ดูเหมือนว่าจะไม่เป็นปัญหา ขอบคุณที่สละเวลา.