簡體   English   中英

對於 ConfiguredTaskAwaitable,與 Unwrap 等效的是什么?

[英]What's the equivalent to Unwrap for a ConfiguredTaskAwaitable?

我正在創建一個(很好地適應現有的)幫助器類,以允許我同步運行async方法。 到目前為止,我已經有了任務工廠和一個靜態方法,只要我不使用.ConfigureAwait配置它們,就可以讓我同步運行async方法,因為.ConfigureAwait將方法的返回值從System.Threading.Tasks.Task<T>System.Runtime.CompilerServices.ConfiguredTaskAwaitable<T> 代碼如下所示:

public static class AsyncUtils {
    private static readonly TaskFactory _taskFactory =
        new TaskFactory(
            CancellationToken.None,
            TaskCreationOptions.None,
            TaskContinuationOptions.None,
            TaskScheduler.Default
        );

    public static TResult RunSync<TResult>(Func<Task<TResult>> func) {
        return _taskFactory
            .StartNew<Task<TResult>>(func)
            .Unwrap<TResult>()
            .GetAwaiter()
            .GetResult();
    }
}

如果我嘗試添加一個方法來處理ConfiguredTaskAwaitable<T> ,它可能如下所示:

    public static TResult RunSync<TResult>(Func<ConfiguredTaskAwaitable<TResult>> func) {
        return _taskFactory
            .StartNew<ConfiguredTaskAwaitable<TResult>>(func)
            .Unwrap<TResult>() // Doesn't exist!
            .GetAwaiter()
            .GetResult();
    }

問題是,從注釋中可以看出, StartNew<ConfiguredTaskAwaitable>返回Task<ConfiguredTaskAwaitable<TResult>>而不是Task<Task<TResult>>這意味着不存在Unwrap方法。 有等價物嗎? 如何為ConfiguredTaskAwaitable創建等效方法?

ConfigureAwait()僅控制在await之后如何恢復上下文。 如果您同步獲取結果,則不會有任何影響,因為沒有“簡歷”。

此外,通常只需執行以下操作即可同步運行異步方法:

TResult RunSync<TResult>(Func<Task<TResult>> func) {
    return func().Result;
}

或者這個,如果你想強制它在線程池上運行:

TResult RunSync<TResult>(Func<Task<TResult>> func) {
    return Task.Run(func).Result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM