异步调用方法

时间:2014-07-19 10:39:45

标签: c# winforms asynchronous

有没有简单的方法可以异步调用我现有的void方法,以便我的表单立即显示而无需等待该方法结束?

该方法将包含近20000个文件的目录读取到数组,并将其填充到ListView。第一次运行时几乎需要十秒钟,Windows还没有缓存它。

3 个答案:

答案 0 :(得分:3)

您可以在新线程中运行代码,因此它不会阻止UI线程,使用TPL

执行此操作非常简单
Task.Run(() =>
{
    // enumerate files
    return files;
}).ContinueWith(t =>
{
     var files = t.Result;
     // update list view
}, TaskScheduler.FromCurrentSynchronizationContext());

答案 1 :(得分:1)

您可以使用Task但也返回结果并使用async / await或使用dispatcher更新UI。

try
{
   var result = await Task.Run(() => GetResult());
   // Update UI: success.
   // Use the result.

   listView.DataSource = result;
   listView.DataBind();
}
catch (Exception ex)
{
   // Update UI: fail.
   // Use the exception.
}

查看this

答案 2 :(得分:0)

尝试以下方法

private delegate void AddItem(string item);
private AddItem addListItem;

private void form_load()
{
    new System.Threading.Thread(new ThreadStart(this.FillItems)).Start();
}

private void FillItems()
{
    addListItem = new AddItem(this.addItem);
    ///Fill your list here
    this.Invoke(addListItem, "ABC");
    this.Invoke(addListItem, "XYZ");
    this.Invoke(addListItem, "PQR");
}

private void addItem(string item)
{
   listView1.Items.Add(item);
}