Tôi đã đọc (và sử dụng) không đồng bộ/đang chờ đợi khá nhiều trong một thời gian nhưng tôi vẫn có một câu hỏi mà tôi không thể nhận được câu trả lời. Giả sử tôi có mã này.Làm cách nào để chạy một số tác vụ không đồng bộ trên chuỗi giao diện người dùng bằng cách sử dụng công việc không đồng bộ/đang chờ?
private async void workAsyncBtn_Click(object sender, EventArgs e)
{
var myTask = _asyncAwaitExcamples.DoHeavyWorkAsync(5);
await myTask;
statusTextBox.Text += "\r\n DoHeavyWorkAsync message";
}
Nó được gọi là từ thread UI và trở về giao diện người dùng đề. Do đó tôi có thể thực hiện các giao diện người dùng cụ thể trong phương thức này và sau await myTask
. Nếu tôi đã sử dụng .ConfigureAwait(false)
Tôi sẽ nhận được một ngoại lệ thread khi thực hiện statusTextBox.Text += "\r\n DoHeavyWorkAsync message";
vì tôi đã nói với myTask
bạn có thể lấy bất kỳ chuỗi nào có sẵn từ nhóm chủ đề.
Câu hỏi của tôi. Theo tôi hiểu, tôi không bao giờ rời khỏi giao diện người dùng trong trường hợp này, nó vẫn chạy không đồng bộ, giao diện người dùng vẫn đáp ứng và tôi có thể bắt đầu một số Tác vụ cùng một lúc và tăng tốc cho ứng dụng của tôi. Làm thế nào có thể làm việc này nếu chúng ta chỉ sử dụng một sợi?
Cảm ơn!
EDIT cho Sievajet
private async void workAsyncBtn_Click(object sender, EventArgs e)
{
await DoAsync();
}
private async Task DoAsync()
{
await Task.Delay(200);
statusTextBox.Text += "Call to form";
await Task.Delay(200);
}
Bạn đặc biệt nói về marshaling của công việc trở lại thread UI? –
Tôi bây giờ thấy rằng câu hỏi không phải là cụ thể như tôi nghĩ, rằng nó có thể được diễn giải theo những cách khác nhau. Tôi đã hiểu rõ hơn về cách đọc câu trả lời của bạn @YuvalItzchakov và sau khi đọc câu trả lời của Sievajet tôi thấy có một câu trả lời khác khi không có hoạt động liên kết IO không đồng bộ. – Andreas
@Andreas Tôi thấy bạn đã thêm một ví dụ khác và nó hoạt động vì một lần nữa: không có chủ đề nào liên quan. Bạn đã đọc vào http://blog.stephencleary.com/2013/11/there-is-no-thread.html, theo đề xuất của Yuval chưa? – Krumelur