我正在创建(很好地适应现有的)帮助程序类,以允许我同步运行async方法。到目前为止,我已经有了任务工厂和一个静态方法,只要我不使用async配置它们,就可以同步运行.ConfigureAwait方法,因为.ConfigureAwait会将方法的返回值从到System.Threading.Tasks.Task<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(); }}如果我尝试添加一种用于处理System.Runtime.CompilerServices.ConfiguredTaskAwaitable<T>的方法,则可能看起来像这样: public static TResult RunSync<TResult>(Func<ConfiguredTaskAwaitable<TResult>> func) { return _taskFactory .StartNew<ConfiguredTaskAwaitable<TResult>>(func) .Unwrap<TResult>() // Doesn't exist! .GetAwaiter() .GetResult(); }从注释中可以看出,问题是ConfiguredTaskAwaitable<T>返回的是StartNew<ConfiguredTaskAwaitable>而不是Task<ConfiguredTaskAwaitable<TResult>>,这意味着Task<Task<TResult>>方法不存在。有等同的吗?如何为Unwrap创建等效方法? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 ConfigureAwait()仅控制await之后如何恢复上下文。如果同步获取结果,则不会有任何结果,因为没有“恢复”。此外,通常只需执行以下操作即可同步运行异步方法:TResult RunSync<TResult>(Func<Task<TResult>> func) { return func().Result;}或者,如果要强制其在线程池上运行,请执行以下操作:TResult RunSync<TResult>(Func<Task<TResult>> func) { return Task.Run(func).Result;} (adsbygoogle = window.adsbygoogle || []).push({});
10-06 08:18