zoukankan      html  css  js  c++  java
  • asynchelper在一个同步方法(非async)方法中等待async方法

        /// <summary>
        /// 异步调用助手类
        /// </summary>
        /// <see cref="http://www.tuicool.com/articles/QF73qaA"/>
        public static class AsyncHelper
        {
            public static void InvokeAndWait(Func<Task> asyncMethod)
            {
                // ReSharper disable once ConvertClosureToMethodGroup
                Task.Run(() => asyncMethod())
                    .ContinueWith(t => t.Wait())
                    .Wait();
            }
    
            public static T InvokeAndWait<T>(Func<Task<T>> asyncMethod)
            {
                var result = default(T);
                // ReSharper disable once ConvertClosureToMethodGroup
                Task.Run<T>(() => asyncMethod())
                    .ContinueWith(t =>
                    {
                        t.Wait();
                        result = t.Result;
                    }).Wait();
                return result;
            }
        }
        /// <summary>
        /// 异步调用助手类
        /// https://github.com/aspnet/AspNetIdentity.git
        /// </summary>
        public static class TaskAsyncHelper
        {
            private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None,
                TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);
            /// <summary>
            /// demo: return TaskAsyncHelper.RunSync(() => manager.UpdateAsync(role));
            /// </summary>
            /// <typeparam name="TResult"></typeparam>
            /// <param name="func"></param>
            /// <returns></returns>
            public static TResult RunSync<TResult>(Func<Task<TResult>> func)
            {
                var cultureUi = CultureInfo.CurrentUICulture;
                var culture = CultureInfo.CurrentCulture;
                return _myTaskFactory.StartNew(() =>
                {
                    Thread.CurrentThread.CurrentCulture = culture;
                    Thread.CurrentThread.CurrentUICulture = cultureUi;
                    return func();
                }).Unwrap().GetAwaiter().GetResult();
            }
    
            /// <summary>
            /// demo: TaskAsyncHelper.RunSync(() => manager.SendEmailAsync(userId, subject, body));
            /// </summary>
            /// <param name="func"></param>
            public static void RunSync(Func<Task> func)
            {
                var cultureUi = CultureInfo.CurrentUICulture;
                var culture = CultureInfo.CurrentCulture;
                _myTaskFactory.StartNew(() =>
                {
                    Thread.CurrentThread.CurrentCulture = culture;
                    Thread.CurrentThread.CurrentUICulture = cultureUi;
                    return func();
                }).Unwrap().GetAwaiter().GetResult();
            }
        }

    此随笔或为自己所写、或为转载于网络。仅用于个人收集及备忘。

  • 相关阅读:
    阿里云OSS对象存储 简单上传文件
    [转]eclipse查看某个java类属于哪个jar包
    win7自带照片查看器
    代码规范,李师兄的指导
    Python 结巴分词模块
    Python requests模块
    CTF
    Python requests模块在Windows下安装
    CentOS 6.5部署HTTP WEB服务器和FTP服务器
    Django搭建博客后台
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/13330411.html
Copyright © 2011-2022 走看看