相关疑难解决方法(0)

await vs Task.Wait - 死锁?

我不太明白之间的差别Task.Waitawait.

我在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?时,为什么这不会导致问题?

c# deadlock task-parallel-library async-await

169
推荐指数
3
解决办法
13万
查看次数

如何从非异步方法调用异步方法?

我有以下方法:

    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)

c# asynchronous async-await

19
推荐指数
2
解决办法
4万
查看次数

如何访问 Task&lt;T&gt; 的 T 对象

我使用 Task.Wait() 方法同步使用异步方法,但是当调用完成时,我想访问由 Task<> 模板化的对象。

Task<HttpResponseMessage> message = _httpClient.GetAsync(Globals.ENDPOINT_URI + Uri.EscapeDataString(query));
message.Wait();
Run Code Online (Sandbox Code Playgroud)

如何访问消息对象的 HttpResponseMessage?

谢谢

.net c# asynchronous

0
推荐指数
1
解决办法
2169
查看次数