【发布时间】:2016-05-06 16:38:58
【问题描述】:
在 C#6 中,我有以下扩展:
public static void With<T>(this T value, Action<T> action) {
action(value);
}
public static R With<T, R>(this T value, Func<T, R> function) {
return function(value);
}
有没有办法获得这些扩展的异步版本?
更新
我正在添加一个示例来澄清。考虑(上下文是 EF 上下文):
IList<Post> posts = context.Posts.With(x => x.ToList());
如果我想使用 ToListAsync,现在该怎么做?
IList<Post> posts = await context.Posts.WithAsync(x => x.ToListAsync());
或者
IList<Post> posts = context.Posts.WithAsync(x => await x.ToListAsync());
最好的方法应该是什么?扩展会是什么样子?
【问题讨论】:
-
BeginInvoke 不会执行任何异步操作,而是会在主线程执行时阻塞...
-
public static async Task WithAsync<T>(this T value, Action<T> action) -
@Gusman, new System.Action
(System.Console.WriteLine).BeginInvoke(0, (cb) => { System.Console.WriteLine(cb.IsCompleted); }, null ); -
@Jay 在 .net 上谈论 Async 时是关于 async/await/Task 的,无论如何,从主线程调用 BeginInvoke 与将来某个时刻调用它完全相同,它在 main 上执行线程并将阻塞它,因此 BeginInvoke 不是异步的,异步应该并行执行并释放某种形式的线程资源,而 BeginInvoke 不会
-
这些是您正在使用的确切功能还是实际功能不同(例如,它们是否有更多语句)?
标签: c#