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

时间:2014-12-23 13:21:59

标签: c# asynchronous

我正在尝试将大量项目添加到列表框中 首先,我定义一个委托,该委托持有对匿名方法的引用,该方法将特定的项目对象添加到列表框项目集合中

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的正确方法吗? 我弄错了吗?
从性能角度来看,你能提出更好的逻辑吗?或者这还不错

1 个答案:

答案 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机制。