【问题标题】:AWAIT / ASYNC example of background worker returning List后台工作人员返回 List 的 AWAIT / ASYNC 示例
【发布时间】:2013-08-27 18:44:38
【问题描述】:

我已经看到了如何在新的 4.5 框架中使用 AWAIT/ASYNC 的一般示例,但没有关于如何用新构造替换后台工作人员的具体指导方针,这些新构造又不会从 .网络框架。如何在不使用 lambda 表达式的情况下这样做,以便返回 List?如果 main() 是 UI 线程(请原谅伪代码),我正在考虑类似以下内容来释放 UI

main()
{
      List<string> resultSet = await CreateList(dirPath);
      console.out(resultSet.ToString());
}

public async List<string> CreateList(string dirPath);
{
     //do some work on dirPath NOT CALLING ANY ASYNC methods 
     return LIST<STRING>;
}

【问题讨论】:

  • 那甚至不应该编译。在这种情况下,异步方法必须返回 Tas 或 Task>

标签: c# async-await c#-5.0


【解决方案1】:

您没有看到将async 用于同步代码的示例的原因是async 用于异步 代码。

也就是说,您可以使用Task.Run 作为BackgroundWorker 的近似替代品。 Task.Run 使您能够获取同步代码并以异步方式使用它:

main()
{
  List<string> resultSet = await Task.Run(() => CreateList(dirPath));
  console.out(resultSet.ToString());
}

public List<string> CreateList(string dirPath);
{
  //do some work on dirPath NOT CALLING ANY ASYNC methods 
  return LIST<STRING>;
}

我目前正在浏览我的博客replacing BackgroundWorker with Task.Run 上的一个系列,您可能会发现它对您有所帮助。

【讨论】:

  • Async/await 面向真正独立于线程的异步工作。事实上,默认情况下 async await 是单线程的。
  • 我不同意“默认情况下异步等待是单线程的”。 asyncawait 与线程无关;没有可以声明的“默认值”。
  • 好的。更恰当地说,异步等待是一种与线程无关的技术。框架中提供的大多数实现和设置不会启动新线程或使用线程池(Task.Factory 除外)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多