Tôi có một ứng dụng nhỏ cần kiểm tra chuỗi kết nối SQL cho một số kết nối (mỗi lần thực hiện một lần tại một thời điểm). Để làm điều này, tôi tạm thời đặt ConnectionTimeout = 5
để tránh phải đợi lâu nếu kết nối không hợp lệ và ConnectionTimeout = 0
(chờ mãi).TPL Cách thực hiện 'Gọi lại'
Để tránh treo UI trong khi chúng tôi cố gắng để Open()
một kết nối xấu (thậm chí với ConnectionTimeout = 5
sự chờ đợi cho SqlException
có thể lên đến hai mươi giây), tôi muốn chạy thử nghiệm trên một sợi riêng biệt sử dụng tác vụ song song Library (TPL). Vì vậy, tôi spin-off chủ đề mới của tôi như:
Task<bool> asyncTestConn = Task.Factory.StartNew<bool>
(() => TestConnection(conn, bShowErrMsg));
return asyncTestConn.Result;
Vấn đề là điều này vẫn khóa UI (rõ ràng), vì nó đang chờ đợi kết quả trước khi trở về người gọi. Làm cách nào để cho phép mã trả lại quyền kiểm soát cho giao diện người dùng (giải phóng GUI) trong khi nhận kết quả cuối cùng từ không đồng bộ Task
?
Ngoài ra, từ trong một Task
tôi có thể hợp pháp làm MessageBox.Show("Some message")
không? Điều này không hoạt động đối với BackgroundWorkers
và chuỗi được gộp chung này là một chuỗi nền theo mặc định; nhưng nó không có vẻ là một vấn đề. Cảm ơn vì đã dành thời gian cho tôi.
Cảm ơn rất nhiều vì phản hồi của bạn. Toàn bộ ý tưởng là để lấy lại để vượt qua kiểm soát trở lại giao diện người dùng/GUI càng sớm càng tốt, làm thế nào để/có thể ở trên đạt được điều đó? Nếu tôi gọi đoạn mã trên từ một phương thức được gọi là 'ParrTestConn (SqlConnection conn, string bShowErrMsg)' thì tôi không thể nói 'asyncTestConn.ContinueWith (ParrTestConn (conn, bShowErrMsg))' ... Hoặc tôi có thể? – MoonKnight
@Killer Bạn chỉ có thể quay lại sau khi bắt đầu(). GUI sẽ luôn đáp ứng khi sử dụng. –
Tôi không có phương thức 'Task.Factory.Create' avilible? –
MoonKnight