Tag: 异步

async / await与手工制作的延续:是否巧妙地使用了ExecuteSynchronously?

我最近写了以下代码: Task ExecAsync( string connectionString, SqlCommand cmd, Func resultBuilder, CancellationToken cancellationToken = default(CancellationToken) ) { var tcs = new TaskCompletionSource(); SqlConnectionProvider p; try { p = GetProvider( connectionString ); Task openTask = p.AcquireConnectionAsync( cmd, cancellationToken ); openTask .ContinueWith( open => { if( open.IsFaulted ) tcs.SetException( open.Exception.InnerExceptions ); else if( open.IsCanceled ) tcs.SetCanceled(); else { var […]

以下代码是否捕获了TPL中原始,继续和子任务的exception?

我正在使用TPL和async / await在我的应用程序的webclient上构建异步API。 很少有地方(通常我需要运行一堆异步任务并最终等待所有这些),我正在关注代码片段。 我只是想确保我正确,因为即使使用TPL编写异步代码相对容易并且async / await 调试/故障排除仍然具有挑战性 (在客户站点上的交互式调试和故障排除问题) – 所以想要正确。 我的目标:能够捕获原始任务,继续任务以及子任务生成的exception,以便我可以处理它(如果需要)。 我不希望任何例外是冷杉和遗忘。 我使用的基本原理: 1.net框架确保将exception附加到任务2.可以将try / catch块应用于async / await以提供同步代码的幻觉/可读性(参考: http://channel9.msdn。 com / Events / TechDays / Techdays-2014-the-Netherlands / Async-programming-deep-dive , http://blogs.msdn.com/b/ericlippert/archive/2010/11/19/asynchrony-in-c- 5-part-seven-exceptions.aspx , http://msdn.microsoft.com/en-us/library/dd537614.aspx等) 问题我想获得批准,我们已经实现了期望的目标(我可以从原始,继续和子任务中捕获exception),并且我可以对样本做任何改进: 例如,是否存在其中一个组合任务(例如,未解包的代理任务)根本不会被激活(waitforactivation状态)的情况,那么waitall可能只是等待任务开始? 我的理解是这些情况永远不会发生,因为延续任务总是执行,并返回由代理使用wnwrap跟踪的任务。 只要我在所有层和apis中遵循类似的模式,模式就应该捕获链接任务中的所有聚合exception。 注意:基本上我正在寻找建议,例如,如果原始任务状态没有运行完成,或者使用附加到父级,那么在继续任务中创建虚拟任务是创建的,这样我只能在父级等上等待才能看到所有可能性以便我可以选择最好的选择,因为这个模式在我的应用程序中严重依赖于error handling。 static void SyncAPIMethod(string[] args) { try { List composedTasks = new List(); //the underlying async […]

所有Entity Framework方法都应该使用异步吗?

在Asp.Net MVC或Asp.Net Web API中,使用查询数据库(即使是最简单的查询)的每个控制器操作都使用async / await模式是不错的做法? 我知道使用async / await会增加复杂性,但是添加它值得吗? 即使是最简单的查询?

是否所有Web请求都是并行执行的并且是异步处理的?

我正在使用由IIS托管的WebApi服务控制器,我正在尝试理解这种架构是如何工作的: 当WebPage客户端同时发送异步请求时,所有这些请求是否都在WebApi控制器上并行执行? 在IIS应用程序池中,我注意到队列大小设置为1,000默认值 – 这是否意味着1,000个最大线程可以同时在WebApi服务器上并行工作? 或者这个值只与IIS队列有关? 我已经读过IIS维护某种线程队列,这个队列是异步发送它的工作吗? 或者IIS发送给WebApi服务的所有客户端请求是否同步发送?

到Task.Run或不运行Task.Run

假设我有一个包含异步方法的接口,我有两个不同的接口实现。 两种实现中的一种是自然异步,而另一种则不是。 实现非异步方法的“最正确”方法是什么? public interface ISomething { Task DoSomethingAsync(); } // Normal async implementation public class Implementation1 : ISomething { async Task ISomething.DoSomethingAsync() { return await DoSomethingElseAsync(); } } // Non-async implementation public class Implementation2 : ISomething { // Should it be: async Task ISomething.DoSomethingAsync() { return await Task.Run(() => DoSomethingElse()); } // Or: async […]

如何validation我的async / await是否正在使用I / O完成端口?

我目前正在将数据库存储过程调用转换为异步,利用async / await。 与此处描述的方法类似。 基于这个答案 ,我想validation异步调用实际上是否正在使用I / O完成端口。 如果它最终等待来自ThreadPool的另一个线程,那么它实际上是在破坏转换呼叫的目的。 validation正在使用I / O完成端口的最佳方法是什么?它不仅仅是阻塞另一个线程?

如何实现IAsyncOperationWithProgress

我正在将一些自定义.NET流移植到WINRT。 语言是C#。 是否有一些IAsyncOperationWithProgress的示例实现? 由于方法ReadAsync,来自Windows.Storage.Streams的WriteAsync需要它们。 自定义WinRT流实现也受到欢迎。 我发现了一些使用create_async的C示例,但我希望在C#中执行此操作,并且我在Metro框架中找不到create_async。 提前致谢

异步任务’堵塞’

最近我开始尝试大规模搜索一个网站用于存档目的,我认为让多个Web请求异步工作以加快速度是个好主意(10,000,000页对于存档来说肯定很多)所以我冒险进入三分钟之后,我开始想知道为什么我正在创建的任务(通过Task.Factory.StartNew )是“堵塞”。 懊恼和好奇我决定测试一下,看它是不是仅仅是因为环境的结果,所以我在VS2012中创建了一个新的控制台项目并创建了这个: static void Main(string[] args) { for (int i = 0; i { t.Stop(); Console.ForegroundColor = ConsoleColor.Green; //Note that the other tasks might manage to write their lines between these colour changes messing up the colours. Console.WriteLine(“Task ” + i2 + ” started after ” + t.Elapsed.Seconds + “.” + t.Elapsed.Milliseconds + “s”); […]

WebClient异步下载文件时检测连接丢失(在C#中)

我正在使用WebClient的DownloadFileAsync(在C#中)方法异步下载文件。 我有事件处理程序附加到DownloadProgressChanged和DownloadFileCompleted事件。 我希望通过DownloadFileCompleted事件处理程序中的AsyncCompletedEventArgs的Error属性通知任何错误。 如果在下载开始之前没有连接,它可以很好地工作。 它出现了正确的错误,我在上面提到的属性中得到了错误。 但是如果在下载过程中连接断开,则不会发生任何事情。 事件处理程序未被调用,它会一直等待。 我该怎么办才能处理这种情况? 谢谢。

Task.WhenAll() – 它是否创建了一个新线程?

根据MSDN : 创建一个任务,该任务将在所有提供的任务完成后完成。 当调用Task.WhenAll()时,它会创建一个任务,但这是否意味着它创建了一个新线程来执行该任务? 例如,下面的控制台应用程序中创建了多少个线程? class Program { static void Main(string[] args) { RunAsync(); Console.ReadKey(); } public static async Task RunAsync() { Stopwatch sw = new Stopwatch(); sw.Start(); Task google = GetString(“http://www.google.com”); Task microsoft = GetString(“http://www.microsoft.com”); Task lifehacker = GetString(“http://www.lifehacker.com”); Task engadget = GetString(“http://www.engadget.com”); await Task.WhenAll(google, microsoft, lifehacker, engadget); sw.Stop(); Console.WriteLine(“Time elapsed: ” + sw.Elapsed.TotalSeconds); […]