Tag: asynchronous

使用Include with async await

我有一个EF查询,我通过它的唯一标识符返回一个’Item’。 我正在使用MVC提供的脚手架控制器,这可以正常工作,但现在我希望它返回属于该项目的标签列表。 我想我可以使用如下所示的’Include’来急切地获取标签。 但是,使用异步时似乎不允许这样做。 Item item = await db.Items.Include(“Tags”).FindAsync(id); 任何人都可以解释为什么这不起作用并建议另一种方法来恢复项目的标签? 干杯 本

在异步方法中避免异步和等待

一个简单的问题; 阅读本文: http : //blog.stephencleary.com/2016/12/eliding-async-await.html 它通常告诉我,使用async / await。 已经这样做了。 但是,他也说你在代理任务时不必使用异步部分。 // Simple passthrough to next layer: elide. Task PassthroughAsync(int x) => _service.DoSomethingPrettyAsync(x); // Simple overloads for a method: elide. async Task DoSomethingPrettyAsync(CancellationToken cancellationToken) { … // Core implementation, using await. } 为什么在通过时不应该使用async / await? 这不是那么方便,这甚至有意义吗? 任何想法?

使用async / await与DataReader? (没有中间缓冲区!)

我的目标很简单,我想做异步I / O调用(使用异步等待) – 但是: 不使用DataFlow依赖( 如在此答案中 ) 没有中间缓冲区( 不像这个答案 ) Projector函数应作为参数发送。 ( 不是这个答案 ) 好。 目前这里是我的代码,它的工作是从db读取并将每一行投影到Func public IEnumerable GetSomeData (string sql, Func projector) { using(SqlConnection _conn = new SqlConnection(@”Data Source=…”)) { using(SqlCommand _cmd = new SqlCommand(sql, _conn)) { _conn.Open(); _cmd.CommandTimeout = 100000; using(IDataReader rdr = _cmd.ExecuteReader()) { while (rdr.Read()) yield return projector(rdr); } } […]

.NET 4.5文件读取性能同步与异步

我们试图测量使用同步方法和异步读取一系列文件之间的性能。 期望在两者之间大约有相同的时间但是使用异步的结果大约慢了5.5倍。 这可能是由于管理线程的开销,但只是想了解您的意见。 也许我们只是在测量时间错误。 这些是正在测试的方法: static void ReadAllFile(string filename) { var content = File.ReadAllBytes(filename); } static async Task ReadAllFileAsync(string filename) { using (var file = File.OpenRead(filename)) { using (var ms = new MemoryStream()) { byte[] buff = new byte[file.Length]; await file.ReadAsync(buff, 0, (int)file.Length); } } } 这是运行它们并启动秒表的方法: static void Test(string name, Func gettask, int count) […]

返回Task的接口的同步实现

类似于在同步代码中实现需要Task返回类型的接口,虽然我很好奇我是否应该忽略编译器错误,而是我的情况生成。 假设我有这样的界面: public interface IAmAwesome { Task MakeAwesomeAsync(); } 在某些实现中,使用async和await async完成可以带来很多好处。 这实际上是接口试图允许的内容。 在其他情况下,也许很少见,只需要一个简单的同步方法来制作真棒。 所以让我们假设实现如下: public class SimplyAwesome : IAmAwesome { public async Task MakeAwesomeAsync() { // Some really awesome stuff here… } } 这有效,但编译器警告: 这种方法缺少’await’运算符并将同步运行。 考虑使用await运算符等待非阻塞API调用,或者’await TaskEx.Run(…)’在后台线程上执行CPU绑定工作。 编译器实际上是在建议这个解决方案: public class SimplyAwesome : IAmAwesome { public async Task MakeAwesomeAsync() { await Task.Run(() => { // Some […]

为什么从Async CTP / Release中删除“SwitchTo”?

我今天尝试使用SwitchTo方法切换到GUI线程,并发现我解除它的示例不起作用,只是因为该方法不存在。 然后我在这里发现了这个模糊: 我们摆脱它的原因是因为它太危险了。 另一种方法是在TaskEx.Run中捆绑你的代码…… 我的问题很简单:它为什么危险? 使用它会带来哪些特定危险? 请注意,我确实阅读了该帖的其余部分,因此我确实理解这里存在技术限制。 我的问题仍然是,如果我意识到这一点,为什么它很危险 ? 我正在考虑重新实现帮助方法来给我指定的function,但是如果有一些根本上被破坏的东西,除了有人认为它是危险的,我不会这样做。 具体来说,非常天真,这是我如何考虑实现所需的方法: public static class ContextSwitcher { public static ThreadPoolContextSwitcher SwitchToThreadPool() { return new ThreadPoolContextSwitcher(); } public static SynchronizationContextSwitcher SwitchTo(this SynchronizationContext synchronizationContext) { return new SynchronizationContextSwitcher(synchronizationContext); } } public class SynchronizationContextSwitcher : INotifyCompletion { private readonly SynchronizationContext _SynchronizationContext; public SynchronizationContextSwitcher(SynchronizationContext synchronizationContext) { _SynchronizationContext = synchronizationContext; } […]