首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Task<DataView>中将异步的返回类型DataView转换为c#

如何在Task<DataView>中将异步的返回类型DataView转换为c#
EN

Stack Overflow用户
提问于 2015-03-25 17:17:44
回答 3查看 832关注 0票数 1

下面的方法调用RetrieveRecords方法,该方法是异步的,返回类型为Task<DataView>。调用方法接受数据类型为DataView。现在我收到了一个错误“无法从system.data.dataView转换到system.Task.dataView。我知道错误是由于类型转换错配造成的。我如何才能将Task<DataView>转换为DataView。这是我真正需要的。我做了大量的研究,但无法找到解决方案。”

代码语言:javascript
复制
public DataView endresult()
{
DataView result = RetrieveRecords(sqlCommand)
}

异步方法,其返回类型为Task<DataView>

代码语言:javascript
复制
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;

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-25 19:27:30

您的代码目前的状态是不编译的。我假定此方法签名是正确的:

代码语言:javascript
复制
public DataView ExecuteDV(SqlCommand sqlCommand);

在这种情况下,RetrieveRecords不能对结果进行await,因此它将是:

代码语言:javascript
复制
public DataView RetrieveRecords(SqlCommand sqlCommand)
{
  return ExecuteDV(sqlCommand);
}

你的“最终结果”当然是:

代码语言:javascript
复制
public DataView endresult()
{
  DataView result = RetrieveRecords(sqlCommand);
  return result;
}

另一方面,如果您使用的是真正的异步方法,那么ExecuteDV将返回一个Task<DataView>

代码语言:javascript
复制
public async Task<DataView> ExecuteDVAsync(SqlCommand sqlCommand);

RetrieveRecords可以像最初所写的那样:

代码语言:javascript
复制
public async Task<DataView> RetrieveRecordsAsync(SqlCommand sqlCommand)
{
  return await ExecuteDVAsync(sqlCommand);
}

然后可以使用awaitDataViewTask<DataView>中解压缩。

代码语言:javascript
复制
public async Task<DataView> endresultAsync()
{
  DataView result = await RetrieveRecordsAsync(sqlCommand);
  return result;
}

但是,我怀疑前者更有可能发生,因为Fill还没有用异步API进行更新。

票数 2
EN

Stack Overflow用户

发布于 2015-03-25 17:25:12

若要检索任务的结果,请使用“等待”关键字。

代码语言:javascript
复制
DataView result = await RetrieveRecords(sqlCommand)

但是,请注意,目前的代码实际上并不是异步的--方法的最终结果不是异步的,您也需要将ExecuteDV标记为异步方法(同时也要确保其中的方法实际上是异步的)。

代码语言:javascript
复制
public async Task<DataView> ExecuteDV(SqlCommand sqlCommand)
票数 0
EN

Stack Overflow用户

发布于 2015-03-25 17:29:46

塞维的评论是绝对正确的。ExecuteDV不会是异步的,因此,RetrieveRecords会阻塞。

现在,回答你的实际问题。如果您处于异步方法中,请使用

代码语言:javascript
复制
var dataView = await RetrieveRecords(command);

否则,使用

代码语言:javascript
复制
var dataView = RetrieveRecords(command).Result;

但是请注意,这可能会阻塞线程,直到RetrieveRecords完成执行。阻塞这样的线程有时会导致死锁。如果你的程序冻结了,你应该考虑这个可能性。此外,如果您发现自己经常这样做,您应该问自己是否可以使用异步/等待,如果没有,那么首先问问自己方法调用是否真的应该是异步的。

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29262247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档