如何在c#</dataview>中将async的返回类型Task <dataview>转换为DataView

时间:2015-03-25 17:17:45

标签: c# asp.net-mvc

以下方法调用RetrieveRecords方法,该方法是异步的,并返回类型为Task&lt; DataView&gt; 。调用方法接受数据类型为DataView。现在我收到错误&#34;无法从system.data.dataView转换为system.Task.dataView。我知道错误是由于类型转换不匹配造成的。如何转换任务&lt; DataView&gt;到DataView。它真的需要我。我做了很多研究,但没有找到解决方案。

public DataView endresult()
{
DataView result = RetrieveRecords(sqlCommand)
}

具有返回类型Task&lt; DataView&gt;

的异步方法
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;

}

3 个答案:

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

然后您可以使用awaitDataView打开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,如果不是,请问自己,方法调用是否真的应该是异步的

同样,如果您将其标记为异步,请确保它执行异步工作。