异步方法未按预期返回字符串



我很确定这是回答,但我找不到它进入SO。我想从async方法返回一个字符串,但它返回"System.Threading.Tasks.Task ' 1[System.String]",而不是字符串值。

调用代码:

DBSql dBSqlSources = new DBSql(ModuleMain.CurrentDatabase.DBServer, ModuleMain.CurrentDatabase.DBDatabase);
string dataSources = dBSqlSources.GetDataSourceAsync().ToString();

我的方法:

public async Task<string> GetDataSourceAsync()
{
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
string ServerName = string.Empty, InstanceName  =string.Empty;
StringBuilder FullServerName = new StringBuilder(string.Empty);
DataTable table = await Task.Run(() => instance.GetDataSources());
foreach (DataRow row in table.Rows)
{
try
{
ServerName = row["ServerName"].ToString();
InstanceName = row["InstanceName"].ToString();
if (!string.IsNullOrEmpty(InstanceName))
{
FullServerName.Append(string.Concat(ServerName, @"", InstanceName));
}
}
catch (Exception ex)
{
ModuleMain._Log.AddError($"GetDataSources, {ex.Message}");
return string.Empty;
}
}
return FullServerName.ToString();
}

代码的问题在于调用函数。它应该有一个await关键字,即

string dataSources =  await dBSqlSources.GetDataSourceAsync();

不需要后面的ToString(),因为返回的类型是Task<string>,字符串将通过await关键字从Task中提取。

(你原帖下面的所有评论都是相同的观点)

async关键字将方法转换为async方法,这允许您在其主体中使用await关键字。当应用await关键字时,它会挂起调用方法并将控制权交还给调用方,直到等待的任务完成。

你需要等待异步方法来获得结果。

DBSql dBSqlSources = new DBSql(ModuleMain.CurrentDatabase.DBServer, 
ModuleMain.CurrentDatabase.DBDatabase);
var dataSources = await dBSqlSources.GetDataSourceAsync();

因为它是一个异步方法,它不能返回一个普通的值作为一个'正常'(同步)方法:调用方法就像你正在使用它将导致调用线程继续到下一个指令,而异步方法并行运行。

我认为这个问题可以帮助你如何使异步方法返回值?

最新更新