繁体   English   中英

这是实现基于任务的异步方法的正确方法吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM