以下方法调用RetrieveRecords方法,该方法是异步的,并返回类型为Task< DataView
> 。调用方法接受数据类型为DataView。现在我收到错误"无法从system.data.dataView转换为system.Task.dataView。我知道错误是由于类型转换不匹配造成的。如何转换任务< 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;
}
答案 0 :(得分:2)
您目前的代码无法编译。我假设这个方法签名是正确的:
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进行更新。
答案 1 :(得分:0)
要检索任务的结果,请使用await关键字。
DataView result = await RetrieveRecords(sqlCommand)
但请注意,现在的代码根本不是异步 - 方法endresult不是异步的,你需要将ExecuteDV标记为异步方法(同时还要确保其中的方法实际上是异步的)
public async Task<DataView> ExecuteDV(SqlCommand sqlCommand)
答案 2 :(得分:-1)
Servy的评论绝对正确。 ExecuteDV
不会异步,因此RetrieveRecords
会阻止。
现在,回答你的实际问题。如果您使用的是异步方法,请使用
var dataView = await RetrieveRecords(command);
否则,请使用
var dataView = RetrieveRecords(command).Result;
但请注意,这可能会阻止线程,直到RetrieveRecords完成执行。阻止这样的线程有时可能会导致死锁。如果您的程序冻结,您应该考虑这种可能性。此外,如果你发现自己做了很多,你应该问自己是否可以使用async / await,如果不是,请问自己,方法调用是否真的应该是异步的
同样,如果您将其标记为异步,请确保它执行异步工作。