HttpClient.GetAsync(…) never returns when using await/async

前端 未结 6 774
[愿得一人]
[愿得一人] 2020-11-22 12:22

Edit: This question looks like it might be the same problem, but has no responses...

Edit: In test case 5 the task appears to be st

6条回答
  •  清酒与你
    2020-11-22 12:58

    Edit: Generally try to avoid doing the below except as a last ditch effort to avoid deadlocks. Read the first comment from Stephen Cleary.

    Quick fix from here. Instead of writing:

    Task tsk = AsyncOperation();
    tsk.Wait();
    

    Try:

    Task.Run(() => AsyncOperation()).Wait();
    

    Or if you need a result:

    var result = Task.Run(() => AsyncOperation()).Result;
    

    From the source (edited to match the above example):

    AsyncOperation will now be invoked on the ThreadPool, where there won’t be a SynchronizationContext, and the continuations used inside of AsyncOperation won’t be forced back to the invoking thread.

    For me this looks like a useable option since I do not have the option of making it async all the way (which I would prefer).

    From the source:

    Ensure that the await in the FooAsync method doesn’t find a context to marshal back to. The simplest way to do that is to invoke the asynchronous work from the ThreadPool, such as by wrapping the invocation in a Task.Run, e.g.

    int Sync() { return Task.Run(() => Library.FooAsync()).Result; }

    FooAsync will now be invoked on the ThreadPool, where there won’t be a SynchronizationContext, and the continuations used inside of FooAsync won’t be forced back to the thread that’s invoking Sync().

提交回复
热议问题