[英]Is this correct way to implement task-based asynchronous method?
我正在尝试向列表框中添加大量项目
首先,我定义一个委托,该委托持有对匿名方法的引用,该引用添加了特定的
列表框Items集合中的item对象
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的正确方法吗?
我犯错了吗?
从性能角度来看,您可以提出更好的逻辑吗? 或者这足够好
正如其他人在评论中提到的那样,后台线程的全部要点是进行后台工作 。 在您的示例中,没有后台工作; 整个后台委托只是将工作发送到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
机制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.