Tag: async await

使用generics类型作为异步方法的返回类型

之前的一个问题让我想知道为什么以下方法会引发编译时错误: 异步方法的返回类型必须为void,Task或Task public async T MyMethodAsync() where T : Task { // Irrelevant code here which returns a Task } 既然我们在编译时知道T总是一个Task或派生类型,为什么这不起作用呢? 编辑 我问的原因是方法可能返回Task或Task 。 假设该方法可以返回,我不想重复代码。 当然,这完全是理论上的,而不是用于生产目的。 编辑2 Lucian Wischik发现了一篇很棒的文章: 为什么必须异步返回Task

在ASP.NET事件处理程序中使用async / await是否安全?

当我遇到这个时,我在ASP.NET中做了一些编码: protected async void someButtonClickHandler(…) { if(await blah) doSomething(); else doSomethingElse(); } 在提出这个问题之后,我对async / await如何工作有了更好的理解。 但后来让我感到震惊的是,以上面显示的方式使用async / await是否安全? 我的意思是在调用await blah之后调用者继续执行。 这意味着它可能会在await blah完成之前将响应呈现给客户端。 这是正确的吗? 如果是这种情况, doSomething() / doSomethingElse()会发生什么。 他们会被处决吗? 如果它们被执行了,用户是否会看到其更改的效果? 在我的情况下,这些方法会更改显示给用户的一些数据,但我也想知道在一般情况下会发生什么。

如何使用Observable实现轮询?

我有一个参数化的rest调用应该每隔五秒用不同的参数执行: Observable restCall = api.method1(param1); 我需要创建一个Observable ,它将使用param1的不同值每5秒轮询一次restCall。 如果api调用失败,我需要收到错误并在5秒内进行下一次调用。 应仅在restCall完成时(成功/错误)测量调用之间的间隔。 我目前正在使用RxJava,但.NET示例也会很好。

带有C#驱动程序2.0的MongoDB(服务器v 2.6.7):如何从InsertOneAsync获取结果

我正在使用C#驱动程序2.0测试MongoDB(服务器v 2.6.7)。 当我使用插入函数InsertOneAsync存在一个存在_id的文档时,我期待一个像你从Mongo shell获得的错误: WriteResult({ “nInserted” : 0, “writeError” : { “code” : 11000, “errmsg” : “insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.Commands.$_id_ dup key: { : 0.0 }” }}) 但问题是带有C#驱动程序的插入不会抛出exception,我找不到插入的WriteResult 。 当我查看数据库时,似乎什么都没发生。 所以我的问题是插入现有的_id时会对InsertOneAsync什么期望? Visual Studio中的代码: IMongoCollection commandsCollection = db.GetCollection(“Commands”); var bson = new BsonDocument { {“_id”, i.Value}, {“label”, i.Key} […]

从链式任务中观察

我正在尝试创建一个Observable,其中每个项目都是通过异步任务生成的。 下一项应该通过对前一项结果的异步调用(共同递归)生成。 在“生成”这个用语中,这看起来像这样 – 除了Generate不支持异步 (它也不支持初始状态的委托)。 var ob = Observable.Generate( async () => await ProduceFirst(), // Task ProduceFirst() prev => Continue(prev) // bool Continue(T); async prev => await ProduceNext(prev) // Task ProduceNext(T) item => item ); 作为一个更具体的示例,要通过一次获取100条消息来查看ServiceBus队列中的所有消息,请按如下方式实现ProduceFirst,Continue和ProduceNext: Task<IEnumerable> ProduceFirst() { const int batchSize = 100; return _serviceBusReceiver.PeekBatchAsync(batchSize); } bool Continue(IEnumerable prev) { return prev.Any(); } […]

如何在控制台应用程序中从Task.WaitAll()获取返回值?

我使用控制台应用程序作为概念certificate和获得异步返回值的新需求。 我发现我需要在main方法中使用Task.WaitAll()来避免需要异步“main()”方法,这是非法的。 我现在卡住试图弄清楚允许我使用generics的重载,或者只返回我可以强制转换的对象,但是在Main()中。

async / await会影响tcp服务器的性能吗?

我在C#5.0中创建一个Tcp服务器,我在调用tcpListener.AcceptTcpClientAsync和networkStream.ReadAsync时使用了await关键字 但是当我使用Process Explorer检查我的服务器的CPU使用率时,我得到以下结果: Tcp Sync版本: CPU使用率为10% Tcp异步版本: 30%的CPU使用率一半的使用是内核使用。 此外,我通过在网络流的外观中添加计数器来测量我接收数据的时间,并且异步版本循环120,000次,而同步版本循环2,500,000次。 在收到的消息/秒中,当从3个不同的客户端接收消息时,异步版本比同步版本慢15%。 为什么Async Version使用比Sync版本更多的CPU? 这是因为async / await关键字吗? 这是正常的Async Tcp服务器比它的同步速度慢吗? 编辑:这是异步tcp服务器代码的示例 public class AsyncTcpListener : ITcpListener { private readonly ServerEndpoint _serverEndPoint; // Custom class to store IpAddress and Port public bool IsRunning { get; private set; } private readonly List _tcpClientConnections = new List(); private TcpListener _tcpListener; public […]

StorageFile NON Metro应用程序中的异步使用

我正在尝试在我的类库中创建一个StorageFile实例… var localFolder = ApplicationData.Current.LocalFolder; StorageFile destinationFile = await localFolder.CreateFileAsync(destination, CreationCollisionOption.GenerateUniqueName); VS11没有建立说:’await’要求’Windows.Foundation.IAsyncOperation’类型具有合适的GetAwaiter方法。 你错过了’系统’的使用指令吗? 显然我使用.net 4.5作为目标,我正在引用Windows程序集…不确定为什么这个代码在MetroStyle中工作但不在类库中构建…如何在类库中创建Storagefile的实例? ?? 在这个阶段,如果以异步方式创建文件并不重要… 请告诉我你的想法…… Stelio

异步一直向下?

试图理解新的异步/等待模式,我有一个问题,我找不到答案,即如果我应该用异步装饰我的方法,如果我打算从其他异步函数调用这些方法,或只是返回Task在适当的地方? 换句话说,这些A,B或C类中哪一个最好,为什么? class A { public async Task foo1() //Should be consumed { return await foo2(); } public async Task foo2() //Could be consumed { return await foo3(); } private async Task foo3() //Private { return await Task.Run(…); } } class B { public async Task foo1() //Should be consumed { return await foo2(); } […]

为什么等待异步这么慢?

我终于得到了VS2012并得到了一个简单的演示,并努力检查异步的潜在性能提升并等待,但令我沮丧的是它更慢! 它可能我做错了,但也许你可以帮助我。 (我还添加了一个简单的Threaded解决方案,并且按预期运行得更快) 我的代码使用一个类来根据系统中的内核数量对数组求和(-1)我有4个内核,所以我看到了大约2倍的加速(2.5个线程)用于线程,但是减少了2倍的速度同样的事情,但使用async / await。 代码:(注意,您需要添加对System.Management的引用以使核心检测器工作) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Management; using System.Diagnostics; namespace AsyncSum { class Program { static string Results = “”; static void Main(string[] args) { Task t = Run(); t.Wait(); Console.WriteLine(Results); Console.ReadKey(); } static async Task Run() { Random random = […]