我試圖瞭解什麼是正確的代碼來異步獲取一組數據,當我沒有訪問客戶端庫我正在使用檢索數據。我指定了一個端點和一個日期範圍,我應該檢索一個播放列表列表。在Start()調用之後,我現在所擁有的東西永遠不會回來。注意:這是在WinForm中運行的。我正在嘗試更好地理解任務,並且不只是想跳到等待或BackgroundWorker。我知道我在某個地方迷路了。C#和任務 - 用戶界面線程掛起 - 預異步/等待關鍵字
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;
}
UPDATE 我做了這些改變,但現在的應用似乎掛起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);
}
如果你在'GetPlaylistsByDateRange'中放置了一個斷點,你會發現它實際上被調用了嗎? – user7116
您需要將同步上下文傳遞給continuation,以便它在UI線程中運行,而不是在另一個線程池線程中運行。除此之外,我沒有看到任何真正的錯誤。 – Servy
您的更新在UI線程上運行* all *任務。只有第二個應該在那裏運行。 –