![](/img/trans.png)
[英]What's wrong with consuming ConfiguredTaskAwaitable from PortableClassLibrary's class under Debugger from MSTest Runner or Console App?
[英]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.