C# 异步调用方法

C# 异步调用方法,c#,winforms,asynchronous,C#,Winforms,Asynchronous,有没有简单的方法异步调用我现有的void方法,这样我的表单就可以立即显示,而不用等待该方法结束 该方法将包含近20000个文件的目录读取到数组中,并将其填充到ListView中。第一次运行时几乎需要10秒钟,Windows尚未缓存它。您可以在新线程中运行代码,这样它就不会阻塞UI线程,使用 您可以在新线程中运行代码,这样就不会阻塞UI线程,使用 您可以使用任务,但也可以返回结果,并使用async/Wait或使用dispatcher更新UI try { var result = await

有没有简单的方法异步调用我现有的void方法,这样我的表单就可以立即显示,而不用等待该方法结束


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

您可以在新线程中运行代码,这样它就不会阻塞UI线程,使用


您可以在新线程中运行代码,这样就不会阻塞UI线程,使用


您可以使用任务,但也可以返回结果,并使用async/Wait或使用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.
}

查看

您可以使用任务,但也可以返回结果,并使用异步/等待或使用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.
}
查看尝试以下方法

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);
}
试试下面的方法

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);
}


你现有的方法在哪里?和我调用它的地方在同一个类中(类Form1)@darx你能告诉我你的代码在哪里填充ListView吗。所以,我可以在给定的解决方案中修改我的代码。你现有的方法在哪里?在同一个类中,而不是在我调用它的地方(类Form1)@darx你能告诉我你的代码在哪里填充列表视图吗。因此,我可以在给定的解决方案中修改我的代码。这很简单!但遗憾的是,它不允许向ListView添加项目,因为它是在其他线程中创建的。@darx更新列表视图时,您只需要将访问权委托回UI线程,请参阅我的更新。我必须阅读更多关于TPL的信息,但即使在我完全理解那里发生的事情之前,我也能让它正常工作。那正是我想要的,谢谢!这很简单!但遗憾的是,它不允许向ListView添加项目,因为它是在其他线程中创建的。@darx更新列表视图时,您只需要将访问权委托回UI线程,请参阅我的更新。我必须阅读更多关于TPL的信息,但即使在我完全理解那里发生的事情之前,我也能让它正常工作。那正是我想要的,谢谢!这是一个windows窗体应用程序。您不能将
DataSource
直接分配给
ListView
控件。没有像
datarouce
这样的属性,您必须使用
items.Add()
方法手动填充所有项目。您确定此方法不会引发类似
交叉线程异常
的错误吗?抱歉,我已经习惯于从ASP.NET执行此操作。但这只是一个示例,在这里您可以绑定项。是的,因为您在分离线程上获取任务中的资源,然后将它们返回到主UI线程并仅呈现它们。我问您这个问题是因为我以前没有使用过该方法。因此,我完全不知道该方法将允许从不同的线程更新UI。如果它比我给出的解决方案好,那么诀窍是它不是不同的线程。由于您使用async Wait从任务中返回,您将再次获得UI线程。这是一个windows窗体应用程序。您不能将
DataSource
直接分配给
ListView
控件。没有像
datarouce
这样的属性,您必须使用
items.Add()
方法手动填充所有项目。您确定此方法不会引发类似
交叉线程异常
的错误吗?抱歉,我已经习惯于从ASP.NET执行此操作。但这只是一个示例,在这里您可以绑定项。是的,因为您在分离线程上获取任务中的资源,然后将它们返回到主UI线程并仅呈现它们。我问您这个问题是因为我以前没有使用过该方法。因此,我完全不知道该方法将允许从不同的线程更新UI。如果它比我给出的解决方案好,那么诀窍是它不是不同的线程。由于使用async Wait从任务中返回,您将再次获得UI线程。除非确实需要,否则应避免创建专用线程。TPL是一个更好的选择,因为它为您提供了很多繁重的工作,而且它可以重用线程池中的现有线程。除非您真的需要,否则您应该避免创建专用线程。TPL是一个更好的选择,因为它为您完成了大量繁重的工作,而且它还重用了线程池中的现有线程。