下面的方法调用RetrieveRecords方法,该方法是异步的,返回类型为Task<DataView>。调用方法接受数据类型为DataView。现在我收到了一个错误“无法从system.data.dataView转换到system.Task.dataView。我知道错误是由于类型转换错配造成的。我如何才能将Task<DataView>转换为DataView。这是我真正需要的。我做了大量的研究,但无法找到解决方案。”
public DataView endresult()
{
DataView result = RetrieveRecords(sqlCommand)
}异步方法,其返回类型为Task<DataView>
public async Task<DataView> RetrieveRecords(SqlCommand sqlCommand)
{
return await ExecuteDV(sqlCommand);
}
public DataView ExecuteDV(SqlCommand sqlCommand)
{
exceptionMessage = string.Empty;
resultType = (int)Helper.ServiceActionType.Success;
var table = new DataTable();
DataView dv = null;
try
{
using (SqlConnection con = new SqlConnection(DBAccess.ConnString))
{
sqlCommand.Connection = con;
con.Open();
SqlDataReader dr = sqlCommand.ExecuteReader();
table.Load(dr);
if (table.Rows != null && table.Rows.Count > 0)
{
dv = table.DefaultView;
}
else
{
resultType = (int)Helper.ServiceActionType.DataNotFound;
}
con.Close();
}
}
return dv;
}发布于 2015-03-25 19:27:30
您的代码目前的状态是不编译的。我假定此方法签名是正确的:
public DataView ExecuteDV(SqlCommand sqlCommand);在这种情况下,RetrieveRecords不能对结果进行await,因此它将是:
public DataView RetrieveRecords(SqlCommand sqlCommand)
{
return ExecuteDV(sqlCommand);
}你的“最终结果”当然是:
public DataView endresult()
{
DataView result = RetrieveRecords(sqlCommand);
return result;
}另一方面,如果您使用的是真正的异步方法,那么ExecuteDV将返回一个Task<DataView>
public async Task<DataView> ExecuteDVAsync(SqlCommand sqlCommand);RetrieveRecords可以像最初所写的那样:
public async Task<DataView> RetrieveRecordsAsync(SqlCommand sqlCommand)
{
return await ExecuteDVAsync(sqlCommand);
}然后可以使用await将DataView从Task<DataView>中解压缩。
public async Task<DataView> endresultAsync()
{
DataView result = await RetrieveRecordsAsync(sqlCommand);
return result;
}但是,我怀疑前者更有可能发生,因为Fill还没有用异步API进行更新。
发布于 2015-03-25 17:25:12
若要检索任务的结果,请使用“等待”关键字。
DataView result = await RetrieveRecords(sqlCommand)但是,请注意,目前的代码实际上并不是异步的--方法的最终结果不是异步的,您也需要将ExecuteDV标记为异步方法(同时也要确保其中的方法实际上是异步的)。
public async Task<DataView> ExecuteDV(SqlCommand sqlCommand)发布于 2015-03-25 17:29:46
塞维的评论是绝对正确的。ExecuteDV不会是异步的,因此,RetrieveRecords会阻塞。
现在,回答你的实际问题。如果您处于异步方法中,请使用
var dataView = await RetrieveRecords(command);否则,使用
var dataView = RetrieveRecords(command).Result;但是请注意,这可能会阻塞线程,直到RetrieveRecords完成执行。阻塞这样的线程有时会导致死锁。如果你的程序冻结了,你应该考虑这个可能性。此外,如果您发现自己经常这样做,您应该问自己是否可以使用异步/等待,如果没有,那么首先问问自己方法调用是否真的应该是异步的。
同样,如果您将其标记为异步,请确保它执行异步工作。
https://stackoverflow.com/questions/29262247
复制相似问题