【发布时间】:2012-12-21 05:07:43
【问题描述】:
当我无法访问用于检索数据的客户端库时,我试图了解什么是异步获取一组数据的正确代码。我指定了一个端点和一个日期范围,我应该检索一个播放列表列表。在 Start() 调用之后,我现在再也没有回来过。注意:这是在 WinForm 中运行的。我试图更好地理解任务,而不只是想跳到等待或 BackgroundWorker。我知道我迷路了。
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;
}
更新 我进行了这些更改,但现在应用程序似乎挂起了 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中放置一个断点,你看到它实际上被调用了吗? -
您需要将同步上下文传递给延续,以便它在 UI 线程而不是另一个线程池线程中运行。除此之外,我在这里看不到任何真正的错误。
-
您的更新在 UI 线程上运行 所有 任务。只有第二个应该在那里运行。
标签: c# asynchronous task-parallel-library async-await