【发布时间】:2014-02-27 12:09:39
【问题描述】:
我尝试使用 c# 的 TPL 异步执行一个简单的代码。但不是在一个单独的线程中!我只想使用主线程,我希望我的 WPF 应用程序不会冻结。
这样,我不使用 Task.Run 或 Task.Factory.StartNew 方法(它们创建一个新线程)。我这样做:
private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var someTask = new Task<List<Person>>(() => CreateList());
await someTask;
ListBoxControl.ItemsSource = someTask.Result;
}
private List<Person> CreateList()
{
var list = new List<Person>();
list.AddRange(Enumerable.Range(1, 1000000).Select(x => new Person(x)));
return list;
}
但是在等待之后,它永远不会返回。我究竟做错了什么?谢谢!
【问题讨论】:
-
如果你不想在另一个线程上执行操作,你根本不需要
async或await。只需同步执行所有内容。 -
1000000 个项目太多了,它会让你的用户感到沮丧。无论如何,我在这里回答了一个类似的问题:stackoverflow.com/a/21592778/1768303.
-
你为什么要让它在 UI 线程上运行呢?您是否正在尝试解决其他问题?
-
是的,这是一个简单的例子。
-
@Ziggy,还请考虑一下当用户再次单击
ButtonBase按钮时可能会发生什么,而您仍因上次单击而填充列表框。
标签: c# task-parallel-library async-await