我正在进行异步httpclient调用,如下所示。
var myDataDtos = new GetAvailableCoursesCommand()
.SetUserId(Id)
.ExecuteAsync();
我在.Select()
部分收到错误。它说Task
不包含Select
var yourData = new List<string>(myDataDtos.Select(x => x.Id.ToString()));
HttpClient方法如下:
public async override Task ExecuteAsync()
{
await _httpService.GetAsync(Url, _parameters, SuccessAction, ErrorAction);
}
public async Task GetAsync<T>(string url, Dictionary<string, object> parameters, Action<T> successAction,
Action<Exception> errorAction = null)
where T : class
{
await GoRequestAsync(url, parameters, HttpMethod.Get, successAction, errorAction);
}
private static async Task GoRequestAsync<T>(string url, Dictionary<string, object> parameters, HttpMethod method,
Action<T> successAction, Action<Exception> errorAction = null, string body = "")
where T : class
{
using (var httpClient = new HttpClient(new HttpClientHandler()))
{
await GoRequest(httpClient, request,
response =>
{
if (successAction == null)
{
return;
}
try
{
var result = typeof (T) == typeof (string)
? response as T
: JsonConvert.DeserializeObject<T>(response);
successAction(result);
}
catch (Exception ex)
{
if (errorAction != null)
{
errorAction(ex);
}
}
},
error =>
{
if (errorAction != null)
{
errorAction(error);
}
});
}
}
答案 0 :(得分:1)
此代码运行时
var myDataDtos = new GetAvailableCoursesCommand()
.SetUserId(Id)
.ExecuteAsync();
你得到一个Task类型的对象,正如编译器所说的那样没有.Select的定义
您需要等待任务才能真正获得结果。像这样的东西
var myDataDtos = await (new GetAvailableCoursesCommand()
.SetUserId(Id)
.ExecuteAsync());
答案 1 :(得分:1)
你的问题从这里开始:
public async override Task ExecuteAsync()
{
await _httpService.GetAsync(Url, _parameters, SuccessAction, ErrorAction);
}
如果您无法将数据返回给来电者,那么执行GET
的重点是什么?
您有两种选择:
如果您是基类的所有者(无论是谁宣布ExecuteAsync
):
public async override Task<T> ExecuteAsync<T>()
{
return await _httpService.GetAsync(Url, _parameters, SuccessAction, ErrorAction);
}
如果您不是该类的所有者或者您无法更改它(例如,由于来自界面的方法),您将需要完全跳过对ExecuteAsync
的呼叫并致电GoAsync
你自己。由于您未提供有关方法使用的数据来源的任何详细信息,因此我无法举例说明。
如前所述,无论您使用哪种方法,您仍需要将来电者更改为:
var data = new GetAvailableCoursesCommand().SetUserId(Id);
var myDataDtos = await data.ExecuteAsync();