C# 不是异步的方法中获取异步的结果
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# 不是异步的方法中获取异步的结果的更多相关文章
- MVC 在action方法中获取当前action的控制器名和action名
如何在某个action方法中获取它所在的控制器和action名称呢. string controllerName = Request.RequestContext.RouteData.Values[& ...
- 如何在onCreate方法中获取视图的宽度和高度
你可以通过视图的getWidth()和getHeight()来获取视图的宽度和高度. 但是,可能会让你失望的是,如果你直接在onCreate方法内调用这两个函数,你会的到0. 为什么呢? 这是因为,当 ...
- 控制层方法中获取url目录
控制层方法中获取url目录 Request.Url.GetLeftPart(UriPartial.Authority).ToString(); //返回 http://localhost:9246(网 ...
- HackThirteen 在onCreate()方法中获取View的宽度和高度
1.概要: Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出: 如果开发一些依赖于UI控件的宽和高的功 ...
- 4、处理方法中获取请求参数、请求头、Cookie及原生的servlet API等
1.请求参数和请求头 使用@RequestParam绑定请求参数,在处理方法的入参处使用该注解可以把请求参数传递给请求方法 —— value :参数名 —— required : 是否必须,默认为tr ...
- Home键的获取监听,安卓4.0后就不能在onkeydown方法中获取了。怎么办。
Android下得到Home键按下的消息 在Android下,并不能通过onKeyDown这样的事件来截获Home键的消息,其原因在Android的文档中已经明确的说过了 public stati ...
- java在方法中获取request对象
在spring的普通类中: HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getReques ...
- springdata 使用plql更新时候注意点 ?2 表示从方法中获取第二个形参的值 ?1表示从方法中获取第一个值
1.query表示的是查询 需要在操作update的方法上再次添加一个注解modifying 2.plql不是springdatajpa自带的sql功能自带的功能 自动有事务: 所以需要我们手动在se ...
- Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?
在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...
随机推荐
- ARTS第十周
之前忘了发布 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的 ...
- RabbitMQ 安装与界面管理
RabbitMQ 安装与界面管理 RabbitMQ概述 官网:https://www.rabbitmq.com/ RabbitMQ是部署最广泛的开源消息代理. RabbitMQ拥有成千上万的用户,是最 ...
- PYTHON 连接SQL2008 导出到EXCEL
#import pymssql from datetime import datetime import pyodbc import os current_dir = os.path.abspath( ...
- .Net Core with 微服务 - Polly 服务降级熔断
在我们实施微服务之后,服务间的调用变的异常频繁.多个服务之间可能是互相依赖的关系.某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败.某一个服务调用失败轻 ...
- python + mysql 实现查询表数据
实例如下: import pymysqldef select_form(): # 打开数据库连接 db = pymysql.connect("localhost", "r ...
- 每天五分钟Go - 常量
常量的声明 常量使用const进行对不会被改变值的修饰符 const 常量名 [常量类型] = 常量值,和变量的声名一样可以省略类型 const a=1 const b="a" c ...
- c++ 父类 子类 虚表占用内存空间情况
#include <iostream> using namespace std; class C {}; class A:public C { private: long a; long ...
- VS2013导入新项目时,连接数据库问题。
用VS2013导入项目进行学习时,导入数据库会报数据库登陆不上的错误... 解决方法: 1.将其自带的数据库连接先删除,使用自己的sql server数据库将项目数据库先附加进去, 2.附加进去后,再 ...
- 获取不到自定义的request的header属性
java获取headers的代码如下: // 获取http-header里面对应的签名信息 Enumeration<?> headerNames = request.getHeaderNa ...
- ContentObserver 内容观察者作用及特点
eg: 1.定义Uri public static Uri KEY_BROWSER_URI = Uri.parse("content://com.android.browser.provid ...