Tôi đang cố gắng hiểu mã đúng để lấy một tập hợp dữ liệu không đồng bộ khi tôi không có quyền truy cập vào lib khách hàng mà tôi đang sử dụng để truy xuất dữ liệu. Tôi chỉ định điểm cuối và phạm vi ngày và tôi phải truy xuất danh sách danh sách phát. Những gì tôi có bây giờ không bao giờ trở lại sau khi cuộc gọi Start(). Lưu ý: điều này đang chạy trong một WinForm. Tôi đang cố gắng hiểu rõ hơn về Nhiệm vụ và không chỉ muốn chuyển sang chờ đợi hoặc là một Người làm nền tảng. Tôi biết tôi bị lạc đâu đó.C# và Tasks - UI Thread Hang - Pre-Async/Từ khóa chờ đợi
private void GoButtonClick(object sender, EventArgs e)
{
string baseUrl = "http://someserver/api";
var startDateTime = this._startDateTimePicker.Value;
var endDateTime = this._endDateTimePicker.Value;
_getPlaylistsFunc = delegate()
{
var client = new PlaylistExportClient(baseUrl);
return client.GetPlaylistsByDateRange(startDateTime, endDateTime).ToList();
};
var task = new Task<List<Playlist>>(_getPlaylistsFunc);
task.ContinueWith((t) => DisplayPlaylists(t.Result));
task.Start();
}
private void DisplayPlaylists(List<Playlist> playlists)
{
_queueDataGridView.DataSource = playlists;
}
CẬP NHẬT tôi đã thực hiện những thay đổi này nhưng bây giờ đăng ký có vẻ để treo thread UI.
private void GoButtonClick(object sender, EventArgs e)
{
string baseUrl = "http://someserver/api";
var startDateTime = this._startDateTimePicker.Value;
var endDateTime = this._endDateTimePicker.Value;
var token = Task.Factory.CancellationToken;
var context = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
var client = new PlaylistExportClient(baseUrl);
_queueDataGridView.DataSource = client.GetPlaylistsByDateRange(startDateTime, endDateTime).ToList();
},token,TaskCreationOptions.None,context);
}
Nếu bạn đặt điểm ngắt trong 'GetPlaylistsByDateRange', bạn có thấy rằng nó thực sự được gọi không? – user7116
Bạn sẽ cần phải vượt qua một bối cảnh đồng bộ hóa để tiếp tục để nó chạy trong chuỗi giao diện người dùng thay vì một chuỗi chủ đề khác. Ngoài ra, tôi không thấy bất kỳ lỗi thực sự nào ở đây. – Servy
Bản cập nhật của bạn chạy * tất cả * tác vụ trên chuỗi giao diện người dùng. Chỉ có người thứ hai nên chạy ở đó. –