我正在尝试将大量项目添加到列表框中 首先,我定义一个委托,该委托持有对匿名方法的引用,该方法将特定的项目对象添加到列表框项目集合中
delegate void D();
然后我也写了异步方法
private async void AddAsync()
{
await Task.Run(() =>
{
for (int i = 0; i < 40000; i++)
{
D r = new D(() => this.listBox1.Items.Add(i));
this.listBox1.Invoke(r);
}
}
);
}
这是实施TAP的正确方法吗?
我弄错了吗?
从性能角度来看,你能提出更好的逻辑吗?或者这还不错
答案 0 :(得分:1)
正如其他人在评论中提到的那样,后台线程的全部意义在于后台工作。在您的示例中,没有后台工作;整个后台委托只是将工作发送到UI线程。
如果这实际上代表了您的代码,您也可以直接在UI线程上执行此操作:
private void Add()
{
for (int i = 0; i < 40000; i++)
this.listBox1.Items.Add(i);
}
请注意,将项目添加到UI是 UI操作,因此必须在UI线程上完成。现在,如果创建项目需要一些时间,那么您可以从后台工作中受益:
private async Task AddAsync()
{
IProgress<int> progress = new Progress<int>(x => this.listBox1.Items.Add(x));
await Task.Run(() =>
{
for (int i = 0; i < 40000; i++)
{
int value = i; // TODO: replace this with the long-running create-item code.
progress.Report(value);
}
});
}
请注意使用IProgress<T>
/ Progress<T>
来避免过时的Control.Invoke
机制。