我不太明白之间的差别Task.Wait和await.
我在ASP.NET WebAPI服务中有类似于以下函数:
public class TestController : ApiController
{
public static async Task<string> Foo()
{
await Task.Delay(1).ConfigureAwait(false);
return "";
}
public async static Task<string> Bar()
{
return await Foo();
}
public async static Task<string> Ros()
{
return await Bar();
}
// GET api/test
public IEnumerable<string> Get()
{
Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());
return new string[] { "value1", "value2" }; // This will never execute
}
}
Run Code Online (Sandbox Code Playgroud)
哪里Get会僵局.
什么可能导致这个?当我使用阻塞等待而不是await Task.Delay?时,为什么这不会导致问题?
我有以下方法:
public string RetrieveHolidayDatesFromSource() {
var result = this.RetrieveHolidayDatesFromSourceAsync();
/** Do stuff **/
var returnedResult = this.TransformResults(result.Result); /** Where result gets used **/
return returnedResult;
}
private async Task<string> RetrieveHolidayDatesFromSourceAsync() {
using (var httpClient = new HttpClient()) {
var json = await httpClient.GetStringAsync(SourceURI);
return json;
}
}
Run Code Online (Sandbox Code Playgroud)
以上不起作用,似乎没有正确返回任何结果.我不知道我在哪里错过强制等待结果的陈述?我希望RetrieveHolidayDatesFromSource()方法返回一个字符串.
以下工作正常,但它是同步的,我相信它可以改进吗?请注意,下面是同步的,我想更改为异步,但由于某种原因无法解决问题.
public string RetrieveHolidayDatesFromSource() {
var result = this.RetrieveHolidayDatesFromSourceAsync();
/** Do Stuff **/
var returnedResult = this.TransformResults(result); /** This is where Result is actually used**/
return returnedResult;
}
private string RetrieveHolidayDatesFromSourceAsync() { …Run Code Online (Sandbox Code Playgroud) 我使用 Task.Wait() 方法同步使用异步方法,但是当调用完成时,我想访问由 Task<> 模板化的对象。
Task<HttpResponseMessage> message = _httpClient.GetAsync(Globals.ENDPOINT_URI + Uri.EscapeDataString(query));
message.Wait();
Run Code Online (Sandbox Code Playgroud)
如何访问消息对象的 HttpResponseMessage?
谢谢