Tag: async await

调试异步/等待(调用堆栈)中的exception

我使用Async / Await释放我的UI-Thread并完成multithreading。 我遇到exception时遇到问题。 我的异步部分的Call Stack总是从ThreadPoolWorkQue.Dipatch()开始,这对我没有多大帮助。 我找到了MSDN文章Andrew Stasyuk。 Async Causality Chain跟踪它,但据我所知,它不是一个随时可用的解决方案。 如果在Async / Await中使用multithreading,最好/最简单的调试方法是什么?

如何在不中断async / await的情况下创建HttpWebRequest?

我有一堆慢function,基本上是这样的: private async Task<List> DownloadSomething() { var request = System.Net.WebRequest.Create(“https://valid.url”); … using (var ss = await request.GetRequestStreamAsync()) { await ss.WriteAsync(…); } using (var rr = await request.GetResponseAsync()) using (var ss = rr.GetResponseStream()) { //read stream and return data } } 除了调用WebRequest.Create之外,这很好地和异步地工作 – 这一行将UI线程冻结几秒钟,这会破坏async / await的目的。 我已经使用BackgroundWorker编写了这个代码,它完美运行并且永远不会冻结UI。 但是, 创建与async / await相关的Web请求的正确,惯用方法是什么? 或者也许应该使用另一个类? 我已经看到了关于异步化WebRequest 这个很好的答案 ,但即使在那里,对象本身也是同步创建的。

为什么调用等待过早地完成父任务?

我正在尝试创建一个控件来公开消费者可以订阅的DoLoading事件,以便执行加载操作。 为方便起见,应该从UI线程调用事件处理程序,允许消费者随意更新UI,但是他们也可以使用async / await来执行长时间运行的任务,而不会阻塞UI线程。 为此,我宣布了以下代表: public delegate Task AsyncEventHandler(object sender, TEventArgs e); 这允许消费者订阅该活动: public event AsyncEventHandler DoLoading; 这个想法是消费者会这样订阅事件(这条线在UI线程中执行): loader.DoLoading += async (s, e) => { for (var i = 5; i > 0; i–) { loader.Text = i.ToString(); // UI update await Task.Delay(1000); // long-running task doesn’t block UI } }; 在适当的时间点,我得到UI线程的TaskScheduler并将其存储在_uiScheduler 。 适当时由具有以下行的loader触发事件(这发生在随机线程中): this.PerformLoadingActionAsync().ContinueWith( […]

如何衡量等待异步操作的性能?

我有一个从多个MessageQueue实例读取的Windows服务。 这些消息队列都运行自己的Task来读取消息。 通常,在阅读消息后,I / O数据库的工作就完成了。 我发现文章声称在I / O操作上使用异步是个好主意,因为它可以释放线程。 我正在尝试模拟在控制台应用程序中使用异步I / O操作的性能提升。 控制台应用程序 在我的测试环境中,我有10个队列。 GetQueues()返回10个不同的MessageQueue实例。 static void Main(string[] args) { var isAsync = Console.ReadLine() == “Y”; foreach (var queue in queueManager.GetQueues()) { var temp = queue; Task.Run(() => ReceiveMessagesForQueue(temp, isAsync)); } while (true) { FillAllQueuesWithMessages(); ResetAndStartStopWatch(); while(!AllMessagesRead()) { Thread.Sleep(10); } Console.WriteLine(“All messages read in {0}ms”, stopWatch.ElapsedMilliseconds); […]

.NET 4.5的异步function是否也适用于MySql和其他数据库?

据我所知,.NET 4.5附带了许多function,可以使异步数据库操作更容易实现。 MSDN说如果连接字符串没有设置为异步工作,ADO.NET的异步方法都不会以异步方式工作。 因此,SqlConnectionStringBuilder附带了一个名为AsynchronousProcessing的属性。 我想知道这些异步function是否也适用于其他数据库服务器(例如mysql)? 如何使用.NET无法识别的无SQL数据库进行异步操作? (例如RavenDB)?

程序在等待时退出

我有一个while循环,应该重复该程序,直到满足某个条件。 在这个循环中我调用异步函数,它为我打印一条消息。 这是(剪短)代码: private void InitializeMessageSystem ( ) { do { // Do stuff await printMessage (“Hello World!”); Console.ReadKey(); } while (condition != true) } 这里的函数printMessage() private static async Task printMessage (string message, int spd = 1) { int delay = 50 / spd; string[] words = message.Split(‘ ‘); int index = 1; for (int […]

一次启动多个async / await函数并单独处理它们

如何一次启动多个HttpClient.GetAsync()请求,并在各自的响应返回后立即处理它们? 首先我尝试的是: var response1 = await client.GetAsync(“http://example.com/”); var response2 = await client.GetAsync(“http://stackoverflow.com/”); HandleExample(response1); HandleStackoverflow(response2); 但当然它仍然是连续的。 那么我试着立即启动它们: var task1 = client.GetAsync(“http://example.com/”); var task2 = client.GetAsync(“http://stackoverflow.com/”); HandleExample(await task1); HandleStackoverflow(await task2); 现在任务同时启动 ,这很好,但当然代码仍然需要一个接一个地等待。 我想要的是能够在它进入时立即处理“example.com”响应,并在它进入时立即处理“stackoverflow.com”响应。 我可以将两个任务放在一个数组中,在一个循环中使用Task.WaitAny() ,检查哪一个完成并调用适当的处理程序,但那么……这比常规的旧回调更好吗? 或者这不是async / await的预期用例吗? 如果没有,我将如何使用HttpClient.GetAsync()与回调? 澄清 – 我所追求的行为就像这个伪代码: client.GetAsyncWithCallback(“http://example.com/”, HandleExample); client.GetAsyncWithCallback(“http://stackoverflow.com/”, HandleStackoverflow);

ContextBoundObject在等待之后引发远程处理错误

我有一些日志代码,使用ContextBoundObject和ContextAttribute编写拦截方法调用。 该代码基于代码项目示例 。 这一切都运行良好,直到我们开始使用此库与利用async和等待的代码。 现在我们在运行代码时遇到了远程错误。 这是一个重现问题的简单示例: public class OhMyAttribute : ContextAttribute { public OhMyAttribute() : base(“OhMy”) { } } [OhMy] public class Class1 : ContextBoundObject { private string one = “1”; public async Task Method1() { Console.WriteLine(one); await Task.Delay(50); Console.WriteLine(one); } } 当我们调用Method1我们在第二个Console.WriteLine上得到以下RemotingException : Remoting cannot find field ‘one’ on type ‘WindowsFormsApplication1.Class1’. 有没有办法使用内置的C#方法解决这个问题,还是我们必须看看像PostSharp这样的替代解决方案?

在asp.net进程中运行多个并行任务的正确方法是什么?

我想我不理解什么。 我原以为Task.Yield()强制为一个任务启动一个新的线程/上下文,但是在重新阅读这个答案时,它似乎只是强制该方法是异步的。 它仍然是在相同的背景下。 什么是正确的方法 – 在asp.net进程中 – 并行创建和运行多个任务而不会导致死锁? 换句话说,假设我有以下方法: async Task createFileFromLongRunningComputation(int input) { //many levels of async code } 当某个POST路由被命中时,我想同时启动上述方法3次, 立即返回 ,但是当完成所有这三个时都要记录。 我想我需要在我的行动中加入这样的东西 public IHttpAction Post() { Task.WhenAll( createFileFromLongRunningComputation(1), createFileFromLongRunningComputation(2), createFileFromLongRunningComputation(3) ).ContinueWith((Task t) => logger.Log(“Computation completed”) ).ConfigureAwait(false); return Ok(); } 什么需要进入createFileFromLongRunningComputation ? 我原以为Task.Yield是正确的,但显然不是。

是否有默认方式获得成功完成的第一个任务?

让我们说我有几个任务: void Sample(IEnumerable someInts) { var taskList = someInts.Select(x => DownloadSomeString(x)); } async Task DownloadSomeString(int x) {…} 我想得到第一个成功任务的结果。 所以,基本的解决方案是写下这样的东西: var taskList = someInts.Select(x => DownloadSomeString(x)); string content = string.Empty; Task firstOne = null; while (string.IsNullOrWhiteSpace(content)){ try { firstOne = await Task.WhenAny(taskList); if (firstOne.Status != TaskStatus.RanToCompletion) { taskList = taskList.Where(x => x != firstOne); continue; } […]