Tag: async await

为什么async / await在我的ASP.net 5控制台应用程序中不起作用?

我在Windows(.NET 4.5.1)和Linux(Mono 4.0.1)上尝试了这个简单的ASP.net 5控制台应用程序,两次都有相同的结果。 注意:我称之为ASP.net 5控制台应用程序,因为这是在Visual Studio中调用到RC的内容。 现在它被称为控制台应用程序(包),但它仍然使用来自https://github.com/aspnet/dnx的 DNX 🙂 我的Program.cs : using System; using System.Threading.Tasks; namespace ConsoleApplication { public class Program { public async void Main(String[] args) { #if DNX451 AppDomain.CurrentDomain.UnhandledException += (s, e) => Console.WriteLine(e); #endif try { await Task.Delay(1000); Console.WriteLine(“After Task.Delay”); } finally { Console.WriteLine(“Inside Finally”); } } } } 我的project.json : […]

为什么异步函数被调用两次?

我正在使用线程计时器来做一些定期工作: private static async void TimerCallback(object state) { if (Interlocked.CompareExchange(ref currentlyRunningTasksCount, 1, 0) != 0) { return; } var tasksRead = Enumerable.Range(3, 35).Select(i => ReadSensorsAsync(i)); await Task.WhenAll(tasksRead); var tasksRecord = tasksRead.Where(x => x.Result != null).Select(x => RecordReadingAsync(x.Result)); await Task.WhenAll(tasksRecord); Interlocked.Decrement(ref currentlyRunningTasksCount); } 我做了定时器回调async并使用了WhenAll 。 在每个工作异步function中,我有一个控制台输出,显示活动。 现在的问题是,在第二个定时器事件中,每个异步函数由于某种原因正在工作两次。 计时器设置为长时间。 该应用程序是Windows控制台类型。 是Select以某种方式让它运行两次?

新的C#异步function是否在编译器中严格实现

作为一名C#程序员,他有兴趣探索“如何工作”,我有兴趣了解更多关于使新的异步function工作的过程。 我跟随Eric Lippert关于异步的优秀文章系列: Async博客文章 我不记得在任何地方看到任何对此function的实现的引用(在高级别),除了“编译器正在为我们完成大部分工作”这一事实。 这个function严格来说是编译器function吗? 编译器是否以某种方式重写代码,就是这样? 还是有其他事情,如运行时支持,使这种情况发生?

如果我在IQueryable上使用等待+ ToListAsync()并且未定义为任务,那么它是否正确

我正在使用带有EF-6的asp.net MVC-5,我不确定使用await + ToListAsync是否有效。 例如,我有以下存储库方法,它返回IQueryable: – public IQueryable getAllScanEmailTo() { return t.TSets.Where(a=>a.Name.StartsWith(“ScanEmail”)); } 我称之为: – var emailsTo = await repository.getAllScanEmailTo().ToListAsync(); 一开始,我以为我会得到一个错误,因为我正在使用“等待”一个未被定义为任务的方法,但上面工作得很好,所以有人可以就此提出建议吗?

TaskCancellationException如何避免成功控制流程中的exception?

在我们的应用程序中,我们使用async / await和Tasks工作了很多。 因此它确实使用Task.Run很多,有时使用内置的CancellationToken取消支持。 public Task DoSomethingAsync(CancellationToken cancellationToken) { return Task.Run(() => { while (true) { if (cancellationToken.IsCancellationRequested) break; //do some work } }, cancellationToken); } 如果我现在使用CancellationToken取消执行,则执行会在下一个循环开始时停止,或者如果Task根本没有启动,则会抛出exception(Task.Run中的TaskCanceledException)。 现在的问题是为什么Task.Run使用Exception控制成功取消而不是仅返回已完成的Task。 是否有任何具体原因MS没有坚持“不要使用例外来控制执行流程”规则? 如何在一个完全无用的try catch(TaskCancelledException)块中避免使用Boxing支持取消(很多)的方法?

DebuggerStepThrough,DebuggerHidden在async-await方法中不起作用

当您在Visual Studio调试器中打开“抛出exception时断开”function时,它会在选定的exception类型的任何位置中断。 告诉它不要在特定方法中断的方法是使用DebuggerStepThrough属性(或DebuggerHidden )来装饰这些方法 。 显然 ,由于某种原因,这对于async方法不起作用。 这是一个重现问题的片段。 调试器将在TestAsync内部TestAsync即使它标记了属性,并且它不会在Test作为例外(它们之间的唯一区别是第一个用async关键字标记): public class Attributes { public async Task Run() { await TestAsync(); await Test(); } [DebuggerHidden] [DebuggerStepThrough] public async Task TestAsync() { try { throw new Exception(“Async”); } catch { } await Task.Delay(100); } [DebuggerHidden] [DebuggerStepThrough] public Task Test() { try { throw new Exception(“sync”); } catch […]

HttpWebRequest.GetResponse()与GetResponseAsync()中的超时行为

当我尝试以下代码时: var request = (HttpWebRequest)HttpWebRequest.Create(url); request.Timeout = 3; // a small value var response = request.GetResponse(); Console.WriteLine(response.ContentLength); 对于我知道加载超过3毫秒的URL(我在Application_BeginRequest放置一个Thread.Sleep(110000) )它工作正常WebException预期抛出WebException 。 问题是当我切换到异步方法时: var response = request.GetResponseAsync().Result; 要么 var response = await request.GetResponseAsync(); 此异步版本完全忽略任何超时值,包括ReadWriteTimeout和ServicePoint.MaxIdleTime 我在MSDN的GetResponseAsync()找不到关于Timeout的任何内容现在我想知道它是否是GetResponseAsync()中的错误或者我在这里使用async的方式有什么问题?

即使在Asp.Net流中使用ConfigureAwait(false)后死锁也是如此

即使在使用ConfigureAwait(false)后我也遇到了死锁,下面是示例代码。 根据示例http://blog.stephencleary.com/2012/02/async-and-await.html(#Avoding Context),这不应该达到死锁。 这是我的class级 : public class ProjectsRetriever { public string GetProjects() { … var projects = this.GetProjects(uri).Result; … … } private async Task<IEnumerable> GetProjects(Uri uri) { return await this.projectSystem.GetProjects(uri, Constants.UserName).ConfigureAwait(false); } } 该类来自共享库: public class ProjectSystem { public async Task<IEnumerable> GetProjects(Uri uri, string userName) { var projectClient = this.GetHttpClient(uri); var projects = await projectClient.GetProjects(); […]

在几乎相同的方法中异步/等待的行为不同

假设我有两种异步方法 public async static Task RunAsync1() { await Task.Delay(2000); await Task.Delay(2000); } 和 public async static Task RunAsync2() { var t1 = Task.Delay(2000); var t2 = Task.Delay(2000); await t1; await t2; } 然后我就像使用它一样 public static void M() { RunAsync1().GetAwaiter().GetResult(); RunAsync2().GetAwaiter().GetResult(); } 结果, RunAsync1将运行4 秒,但RunAsync2仅运行2秒 任何人都可以解释原因吗? 方法几乎相同。 有什么不同?

Progress 没有报告function

我有windows form app这是我的代码: private async void btnGo_Click(object sender, EventArgs e) { Progress labelVal = new Progress(a => labelValue.Text = a); Progress progressPercentage = new Progress(b => progressBar1.Value = b); // MakeActionAsync(labelVal, progressPercentage); await Task.Factory.StartNew(()=>MakeActionAsync(labelVal,progressPercentage)); MessageBox.Show(“Action completed”); } private void MakeActionAsync(Progress labelVal, Progress progressPercentage) { int numberOfIterations=1000; for(int i=0;i<numberOfIterations;i++) { Thread.Sleep(10); labelVal.Report(i.ToString()); progressPercentage.Report(i*100/numberOfIterations+1); } } 我得到编译错误,“System.Progress”不包含’Report’的定义,并且没有扩展方法’Report’接受类型’System.Progress’的第一个参数可以找到(你是否缺少using指令或程序集参考?)” […]