【发布时间】:2015-11-06 00:39:49
【问题描述】:
在体验 4.5 的新 async 和 Await 功能时,我想在继续之前澄清一些困惑。我一直在阅读不同的文章以及关于 SO 的不同问题,它帮助我理解了 Async 和 Await 的工作原理。我将尝试将我的理解和困惑放在这里,如果有人编码教育我和其他正在寻找相同事物的人,我将不胜感激。我正在用非常简单的措辞讨论这个问题。
所以使用 Async 是为了让编译器知道被 Async 标记的方法包含 Await 操作(Long 操作)。最新框架包含用于异步操作的不同新内置方法。
connection.OpenAsync、ExecuteScalarAsync 等内置异步函数与 Await 关键字一起使用。我不知道这些异步方法的内部工作原理,但我强烈的猜测是他们在后台使用任务。
我是否可以将此作为一般规则,即 Await 将与任何实现 Task 的方法一起使用。因此,如果我需要创建自己的执行长时间操作的方法,那么我会将其创建为 Task 并在调用它时使用 Await 关键字?
第二个最重要的事情是,将方法创建为 Async 或将其创建为任务的经验法则是什么。例如,
public void SampleMain()
{
for (int i = 1; i <= 100; i++)
{
DataTable dt = ReadData(int id);
}
}
public DataTable ReadData(int id)
{
DataTable resultDT = new DataTable();
DataTable dt1 = new DataTable();
// Do Operation to Fill DataTable from first connection string
adapter.Fill(dt1);
DataTable dt2 = new DataTable();
// Do Operation to Fill DataTable from first connection string
adapter.Fill(dt2);
// Code for combining datatable and returning the resulting datatable
// Combine DataTables
return resultDT;
}
public string GetPrimaryConnectionString()
{
// Retrieve connection string from some file io operations
return "some primary connection string";
}
public string GetSecondaryConnectionString()
{
// Retrieve connection string from some file io operations
return "some secondaryconnection string";
}
现在这是一个非常简单的场景,它是基于我过去工作过的一些真实世界应用程序创建的。所以我只是想知道如何使整个过程异步。
我是否应该将 GetPrimaryConnectionString 和 GetSecondaryConnectionString 作为任务并在 ReadData 中等待它们。 ReadData 也会是一个任务吗?如何在 SampleMain 函数中调用 ReadData?
另一种方法是在 SampleMain 中为 ReadData 创建一个任务并运行该任务并跳过将其他方法转换为任务。这是好方法吗?会是真正的异步吗?
【问题讨论】:
-
您的意思是“将方法创建为任务”的示例比您添加到帖子中的一些随机同步代码更有用。
-
@Alexei Levenkov 感谢您的回复。我完全不明白你的评论。我介绍的是一个示例原始场景,代码尽可能少,以使读者了解如何使用 Async 和 Await 使整个过程异步。这根本不是随机的。
-
@M.kazem Akhgary。好的。因此无需更改 GetPrimaryConnectionString 和 GetSecondaryConenctionString 方法。如果我只是将 ReadData 设为异步,那么所有这些过程都是异步的吗?
标签: c# asynchronous async-await task-parallel-library