C#和任务 – UI线程挂起 – 预异步/等待关键字
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#和任务 – UI线程挂起 – 预异步/等待关键字,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2678字,纯文字阅读大概需要4分钟。
内容图文
![C#和任务 – UI线程挂起 – 预异步/等待关键字](/upload/InfoBanner/zyjiaocheng/823/53abe0095ffc4668aa2c032e02dae9d0.jpg)
当我无法访问我用来检索数据的客户端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;
}
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);
}
解决方法:
我建议你使用基于任务的异步模式.这很简单:
private async void GoButtonClick(object sender, EventArgs e)
{
string baseUrl = "http://someserver/api";
var startDateTime = this._startDateTimePicker.Value;
var endDateTime = this._endDateTimePicker.Value;
var playlists = await Task.Run(() =>
{
var client = new PlaylistExportClient(baseUrl);
return client.GetPlaylistsByDateRange(startDateTime, endDateTime).ToList();
});
_queueDataGridView.DataSource = playlists;
}
请注意,这将阻止线程池线程;如果您可以修改库以使用GetPlaylistsByDateRangeAsync方法,则可以提高效率.
编辑:如果您坚持使用.NET 4.0,则可以安装Microsoft.Bcl.Async以获得完整的异步/等待功能.如果 – 由于一些莫名其妙的原因 – 您仍然无法使用async / await,那么您可以这样做:
private void GoButtonClick(object sender, EventArgs e)
{
string baseUrl = "http://someserver/api";
var startDateTime = this._startDateTimePicker.Value;
var endDateTime = this._endDateTimePicker.Value;
var context = TaskScheduler.FromCurrentSynchronizationContext();
Task.Run(() =>
{
var client = new PlaylistExportClient(baseUrl);
return client.GetPlaylistsByDateRange(startDateTime, endDateTime).ToList();
}).ContinueWith(t =>
{
_queueDataGridView.DataSource = t.Result;
}, context);
}
但请注意,使用此方法时,错误处理会更复杂.
内容总结
以上是互联网集市为您收集整理的C#和任务 – UI线程挂起 – 预异步/等待关键字全部内容,希望文章能够帮你解决C#和任务 – UI线程挂起 – 预异步/等待关键字所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。