var waiter = HP.UtilsLib.TaskAwaiterHelper.GetTaskAwaiter(
async () =>
{
  return await feedBack(version, Email, EmailContent).ConfigureAwait(false);
}
);
var result = waiter.GetResult();
waiter.Dispose();

--------------------------------------------------------------------------------------------------

public interface ITaskAwaiter<TResult>: IDisposable
{
  TResult GetResult();
  void Await();
}
public interface ITaskAwaiter: IDisposable
{
  void Await();
}
public static class TaskAwaiterHelper
{
  private class TaskAwaiter<TResult> : ITaskAwaiter<TResult>
  {
    private ManualResetEvent waiter = new ManualResetEvent(false);
    public TaskAwaiter(Func<TResult> function)
    {
      Task.Run(
          () => {
          result=function();
          waiter.Set();
          }
          );
    }
    public TaskAwaiter(Func<Task<TResult>> function)
    {
      Task.Run(
          async () =>
          {
            result = await function().ConfigureAwait(false);
            waiter.Set();
          }
          );
    }
  private TResult result;
  public void Await()
  {
    waiter.WaitOne();
  }

  public TResult GetResult()
  {
    Await();
    return result;
  }

  public void Dispose()
  {
    waiter.Dispose();
  }
}

private class TaskAwaiter : ITaskAwaiter
{
  private ManualResetEvent waiter = new ManualResetEvent(false);
  public TaskAwaiter(Action action)
  {
    Task.Run(
      () => {
          action();
          waiter.Set();
        }
        );
  }  
public TaskAwaiter(Func<Task> function)
{
  Task.Run(
      async () => {
      await function().ConfigureAwait(false);
      waiter.Set();
      }
    );
}
public void Await()
{
  waiter.WaitOne();
}

public void Dispose()
{
waiter.Dispose();
}
}

public static ITaskAwaiter<TResult> GetTaskAwaiter<TResult>(Func<TResult> function)
{
TaskAwaiter<TResult> taskAwaiter = new TaskAwaiter<TResult>(function);
return taskAwaiter;
}
public static ITaskAwaiter GetTaskAwaiter(Func<Task> function)
{
TaskAwaiter taskAwaiter = new TaskAwaiter(function);
return taskAwaiter;
}
public static ITaskAwaiter<TResult> GetTaskAwaiter<TResult>(Func<Task<TResult>> function)
{
TaskAwaiter<TResult> taskAwaiter = new TaskAwaiter<TResult>(function);
return taskAwaiter;
}
public static ITaskAwaiter GetTaskAwaiter(Action function)
{
TaskAwaiter taskAwaiter = new TaskAwaiter(function);
return taskAwaiter;
}
}

C# 不是异步的方法中获取异步的结果的更多相关文章

  1. MVC 在action方法中获取当前action的控制器名和action名

    如何在某个action方法中获取它所在的控制器和action名称呢. string controllerName = Request.RequestContext.RouteData.Values[& ...

  2. 如何在onCreate方法中获取视图的宽度和高度

    你可以通过视图的getWidth()和getHeight()来获取视图的宽度和高度. 但是,可能会让你失望的是,如果你直接在onCreate方法内调用这两个函数,你会的到0. 为什么呢? 这是因为,当 ...

  3. 控制层方法中获取url目录

    控制层方法中获取url目录 Request.Url.GetLeftPart(UriPartial.Authority).ToString(); //返回 http://localhost:9246(网 ...

  4. HackThirteen 在onCreate()方法中获取View的宽度和高度

    1.概要:     Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出:     如果开发一些依赖于UI控件的宽和高的功 ...

  5. 4、处理方法中获取请求参数、请求头、Cookie及原生的servlet API等

    1.请求参数和请求头 使用@RequestParam绑定请求参数,在处理方法的入参处使用该注解可以把请求参数传递给请求方法 —— value :参数名 —— required : 是否必须,默认为tr ...

  6. Home键的获取监听,安卓4.0后就不能在onkeydown方法中获取了。怎么办。

    Android下得到Home键按下的消息   在Android下,并不能通过onKeyDown这样的事件来截获Home键的消息,其原因在Android的文档中已经明确的说过了 public stati ...

  7. java在方法中获取request对象

    在spring的普通类中: HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getReques ...

  8. springdata 使用plql更新时候注意点 ?2 表示从方法中获取第二个形参的值 ?1表示从方法中获取第一个值

    1.query表示的是查询 需要在操作update的方法上再次添加一个注解modifying 2.plql不是springdatajpa自带的sql功能自带的功能 自动有事务: 所以需要我们手动在se ...

  9. Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

    在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...

随机推荐

  1. Servlet核心技术

    一.基本概念 1.C/S C/S架构是客户端服务器架构,将需要处理的业务合理的分配到客户端和服务器,客户端负责与用户的交互任务,服务器负责数据管理. 优点: 客户端界面和功能可以很丰富 应用服务器负荷 ...

  2. [TJOI2007]书架 题解

    文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...

  3. 「CF85E」 Guard Towers

    「CF85E」 Guard Towers 模拟赛考了这题的加强版 然后我因为初值问题直接炸飞 题目大意: 给你二维平面上的 \(n\) 个整点,你需要将它们平均分成两组,使得每组内任意两点间的曼哈顿距 ...

  4. printf函数返回值

    //返回值:正确返回输出的字符总数,错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志. #include <stdio.h> #defi ...

  5. 【剑指offer】73.数组中出现次数超过一半的数字

    73.数组中出现次数超过一半的数字 知识点:数组:哈希:占领地思想: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4 ...

  6. React 模块与组件

    React 模块与组件 几个重要概念理解 1). 模块与组件 1. 模块: 理解: 向外提供特定功能的js程序, 一般就是一个js文件 为什么: js代码更多更复杂 作用: 复用js, 简化js的编写 ...

  7. height设置100%不起作用

    详细讲解了原因:http://www.webhek.com/post/css-100-percent-height.html

  8. Requests方法 -- session方法

    import requests#禁用安全请求警告from requests.packages.urllib3.exceptions import InsecureRequestWarningreque ...

  9. 使用宝塔配置laravel站点时,遇到open_basedir restriction in effect. 原因与解决方法

    今天一位朋友在linux服务器部署thinkphp5的时候PHP报了这个错误,如下: Warning: require(): open_basedir restriction in effect. F ...

  10. ODOO14笔记---系统升级崩溃后进不去系统解决办法

    一.通过pycharm升级模块:  2.对于已安装odoo模块,升级报错系统崩溃的解决办法:---执行以下SQL     update ir_module_module set state ='ins ...