Bud*_*Joe 5 c# asynchronous task-parallel-library async-await
当我无法访问我用来检索数据的客户端lib时,我试图理解异步获取一组数据的正确代码是什么.我指定了一个端点和一个日期范围,我应该检索一个播放列表列表.我现在所拥有的东西在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;
}
Run Code Online (Sandbox Code Playgroud)
更新 我做了这些更改,但现在应用程序似乎挂起了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);
}
Run Code Online (Sandbox Code Playgroud)
看起来您正在后台线程中分配给 UI 控件的属性。这通常是坏消息。当您这样做时,WPF 通常会引发异常,但不确定 WinForms 是否如此。
在后台线程中捕获数据,但在将其分配给 UI 控件之前切换回主 UI 线程。尝试使用类似的方法将数据发布到 UI 线程
var uiSync = SynchronizationContext.Current;
Task.Factory.StartNew(() =>
{
var client = new PlaylistExportClient(baseUrl);
var list = client.GetPlaylistsByDateRange(...).ToList();
uiSync.Post(() => _queueDataGridView.DataSource = list, null);
},token,TaskCreationOptions.None,context);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2580 次 |
最近记录: |