Questions tagged «asynchronous»

异步编程是一种用于延迟具有高延迟或低优先级的操作的策略,通常是为了提高软件的性能,响应能力和/或可组合性。通常使用事件驱动的编程和回调的某种组合来采用此类策略,并且可以选择通过协程和/或线程并发使用。

5
非阻塞IO与异步IO以及Java实现
尝试为自己总结这两个概念之间的区别(因为当我看到人们在一句话中同时使用这两个概念时,我感到非常困惑,例如“ Non-blocking async IO”,我试图弄清楚它是做什么的)意思)。 因此,以我的理解,无阻塞IO是操作系统的主要机制,如果有任何可用数据,则该OS处理IO,否则仅返回错误/不执行任何操作。 在异步IO中,您仅提供回调,当数据可用时,系统将通知您的应用程序。 那么,实际上什么是“非阻塞异步IO”?以及如何在Java中实现它们(标准JDK,没有外部库,我知道有java.nio.channels.{Channels, Selector, SelectorKey}和java.nio.channels.{AsynchronousSocketChannel}):非阻塞IO,异步IO和非阻塞异步IO(如果有的话)?

2
访问StackExchange.Redis时出现死锁
调用StackExchange.Redis时,我陷入了僵局。 我不知道到底是怎么回事,这非常令人沮丧,我将感谢您提供任何有助于解决或解决此问题的建议。 如果您也有这个问题,并且不想阅读所有这些内容; 我建议您尝试设置PreserveAsyncOrder为false。 ConnectionMultiplexer connection = ...; connection.PreserveAsyncOrder = false; 这样做可能会解决此Q&A即将发生的僵局,并且还可以提高性能。 我们的设置 该代码既可以作为控制台应用程序运行,也可以作为Azure工作者角色运行。 它使用HttpMessageHandler公开REST api,因此入口点是异步的。 代码的某些部分具有线程相似性(由单个线程拥有,并且必须由单个线程运行)。 代码的某些部分是仅异步的。 我们正在做异步同步和异步同步的反模式。(混合await和Wait()/ Result)。 访问Redis时,我们仅使用异步方法。 我们将.NET 4.5使用StackExchange.Redis 1.0.450。 僵局 当应用程序/服务启动时,它会正常运行一段时间,然后突然(几乎)所有传入请求停止运行,它们永远不会产生响应。所有这些请求都陷入僵局,等待对Redis的调用完成。 有趣的是,一旦发生死锁,对Redis的任何调用都将挂起,但前提是这些调用是由在线程池上运行的传入API请求进行的。 我们还从低优先级的后台线程对Redis进行了调用,即使死锁发生后,这些调用仍继续起作用。 似乎只有在线程池线程上调用Redis时才会发生死锁。我不再认为这是由于这些调用是在线程池线程上进行的。而是,即使发生死锁情况,似乎任何没有继续执行或具有同步安全继续执行的异步Redis调用都将继续起作用。(请参阅下面我的看法) 有关 StackExchange.Redis死锁 混合await和Task.Result(像我们这样,异步同步)导致死锁。但是我们的代码在没有同步上下文的情况下运行,因此不适用于这里,对吧? 如何安全地混合同步和异步代码? 是的,我们不应该那样做。但是我们这样做了,我们将不得不继续这样做一段时间。许多代码需要迁移到异步世界中。 同样,我们没有同步上下文,因此这不应引起死锁,对吗? 设置ConfigureAwait(false)之前await没有任何影响。 异步命令和Task.WhenAny在StackExchange.Redis中等待后发生超时异常 这是线程劫持问题。目前情况如何?这可能是问题所在吗? StackExchange.Redis异步调用挂起 从马克的答案: ...混合等待和等待不是一个好主意。除了死锁,这是“异步同步”-一种反模式。 但是他也说: SE.Redis内部绕过同步上下文(对于库代码而言是正常的),因此它不应具有死锁 因此,据我了解,StackExchange.Redis应该与我们是否使用sync-over-async反模式无关。只是不建议这样做,因为它可能是其他代码中死锁的原因。 但是,据我所知,在这种情况下,死锁确实在StackExchange.Redis内部。如果我错了,请纠正我。 调试结果 我发现僵局似乎有其源ProcessAsyncCompletionQueue上的124线CompletionManager.cs。 该代码段: while (Interlocked.CompareExchange(ref …

2
无时钟计算机芯片发生了什么?
几年前,“下一件大事”是无时钟计算机。其背后的想法是,没有时钟,处理器将运行得更快。 那时是现在,我找不到任何有关它如何进行的信息,或者找不到这个主意... 有人知道吗 以供参考: http://www.cs.columbia.edu/~nowick/technology-review-article-10-01.pdf

5
如何异步Files.ReadAllLines并等待结果?
我有以下代码, private void button1_Click(object sender, RoutedEventArgs e) { button1.IsEnabled = false; var s = File.ReadAllLines("Words.txt").ToList(); // my WPF app hangs here // do something with s button1.IsEnabled = true; } Words.txt我将大量单词读入s变量,我正在尝试使用C#5中的asyncandawait关键字,Async CTP Library因此WPF应用程序不会挂起。到目前为止,我有以下代码, private async void button1_Click(object sender, RoutedEventArgs e) { button1.IsEnabled = false; Task<string[]> ws = Task.Factory.FromAsync<string[]>( // What …

3
Node.js 7.5上的``等待意外标识符''
我正在尝试使用awaitNode.js中的关键字。我有这个测试脚本: "use strict"; function x() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve({a:42}); },100); }); } await x(); 但是当我在节点上运行它时 await x(); ^ SyntaxError: Unexpected identifier 是否在Mac上使用Node.js 7.5或Node.js 8(每晚构建)使用node或node --harmony-async-await在Node.js'repl'中运行它。 奇怪的是,相同的代码在Runkit JavaScript笔记本环境中也有效:https ://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b 我究竟做错了什么?

4
将Func委托与Async方法一起使用
我正在尝试将Func与异步方法一起使用。我得到一个错误。 无法将异步lambda表达式转换为委托类型'Func<HttpResponseMesage>'。异步lambda表达式可能返回void,Task或Task<T>(都不能转换为)'Func<HttpResponseMesage>'。 以下是我的代码: public async Task<HttpResponseMessage> CallAsyncMethod() { Console.WriteLine("Calling Youtube"); HttpClient client = new HttpClient(); var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM"); Console.WriteLine("Got Response from youtube"); return response; } static void Main(string[] args) { Program p = new Program(); Task<HttpResponseMessage> myTask = p.CallAsyncMethod(); Func<HttpResponseMessage> myFun =async () => await myTask; Console.ReadLine(); }


5
为什么要使用std :: async?
在尝试使用std :: async并阅读其定义的同时,我试图深入探索新C ++ 11标准的所有选项,我注意到至少在gcc 4.8.1的Linux下有两件事: 它称为async,但它确实具有“顺序行为”,基本上在您调用与async函数foo相关联的future的行中,该程序将阻塞直到foo执行完毕。 它取决于与其他库完全相同的外部库以及更好的非阻塞解决方案,这意味着pthread,如果要使用std::async,则需要pthread。 在这一点上,我很自然地问为什么甚至在一组简单的函子上都选择std :: async?该解决方案甚至根本无法扩展,您调用的未来越多,程序的响应性就越差。 我想念什么吗?您能否显示一个示例,该示例被授予以异步,非阻塞方式执行?


10
如何使用jQuery Promise链接三个异步调用?
我有三个需要以同步方式进行的HTTP调用,如何将数据从一个调用传递到另一个调用? function first() { ajax() } function second() { ajax() } function third() { ajax() } function main() { first().then(second).then(third) } 我尝试将deferred用于这两个函数,并提出了部分解决方案。我可以扩展为三个功能吗? function first() { var deferred = $.Deferred(); $.ajax({ "success": function (resp) { deferred.resolve(resp); }, }); return deferred.promise(); } function second(foo) { $.ajax({ "success": function (resp) { }, "error": …

2
“ UseTaskFriendlySynchronizationContext”是什么意思?
asp.net 4.5中有一个新的应用程序设置 <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 这样的代码可以在asp.net 4.0中运行 protected void Button1_Click(object sender, EventArgs e) { CallAysnc(); } public void CallAysnc() { AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(Guid.NewGuid().ToString()); WebClient client = new WebClient(); client.DownloadStringCompleted += (object sender, DownloadStringCompletedEventArgs e) => { asyncOp.PostOperationCompleted(CallCompleted, e.Result); }; client.DownloadStringAsync(new Uri("http://www.google.com")); } private void CallCompleted(object args) { Response.Write(args.ToString()); …

10
如何强制顺序执行Javascript?
我只发现了涉及类,事件处理程序和回调的相当复杂的答案(在我看来,这似乎是一种大锤方法)。我认为回调可能有用,但我似乎无法在最简单的上下文中应用这些回调。请参阅以下示例: <html> <head> <script type="text/javascript"> function myfunction() { longfunctionfirst(); shortfunctionsecond(); } function longfunctionfirst() { setTimeout('alert("first function finished");',3000); } function shortfunctionsecond() { setTimeout('alert("second function finished");',200); } </script> </head> <body> <a href="#" onclick="javascript:myfunction();return false;">Call my function</a> </body> </html> 这样,第二个功能在第一个功能之前完成;强制第二个功能延迟执行直到第一个功能完成的最简单方法是什么(或有没有?)? - -编辑 - - 因此,这是一个垃圾示例,但是感谢David Hedlund,我在这个新示例中看到了它确实是同步的(以及在测试过程中使浏览器崩溃!): <html> <head> <script type="text/javascript"> function myfunction() { …

3
在doc上执行写入:除非已明确打开,否则无法从异步加载的外部脚本写入文档。
我试图在页面加载执行后加载某个脚本,如下所示: function downloadJSAtOnload(){ var element = document.createElement("script"); element.src = "scriptSrc"; document.body.appendChild(element); } if (window.addEventListener) window.addEventListener("load", downloadJSAtOnload, false); else if (window.attachEvent) window.attachEvent("onload", downloadJSAtOnload); else window.onload = downloadJSAtOnload; 尽管此脚本似乎执行并下载了“ scriptSrc”,并将其附加在body标签末尾之前,但它在控制台(chrome)中产生以下消息(不是错误) 无法在“文档”上执行“写入”:无法通过异步加载的外部脚本写入文档,除非已明确打开该文档。 这到底是什么意思?我应该做些不同的事情吗?即使我得到了预期的行为?

3
为什么要使用异步请求而不是使用更大的线程池?
在荷兰的Techday期间,Steve Sanderson进行了有关C#5,ASP.NET MVC 4和异步Web的演讲。 他解释说,当请求需要很长时间才能完成时,线程池中的所有线程都变得繁忙,因此新的请求必须等待。服务器无法处理负载,一切都变慢了。 然后,他展示了异步Web请求的使用如何提高性能,因为随后将工作委派给另一个线程,并且线程池可以快速响应新的传入请求。他甚至对此进行了演示,并显示出50个并发请求首先耗时50 * 1s,但是异步行为总共仅1,2 s。 但是看到这个之后,我仍然有一些疑问。 为什么我们不能只使用更大的线程池?是不是不是使用async / await来使另一个线程变慢,而是仅仅从一开始就增加了线程池?这不像我们运行的服务器突然获得更多线程或其他东西吗? 来自用户的请求仍在等待异步线程完成。如果池中的线程正在执行其他操作,那么“ UI”线程如何保持繁忙?史蒂夫(Steve)提到了一些“知道何时完成的智能内核”。这是如何运作的?

3
当必须同时具有异步和同步版本的代码时,如何避免违反DRY原理?
我正在一个需要同时支持异步和同步版本的同一逻辑/方法的项目。因此,例如,我需要: public class Foo { public bool IsIt() { using (var conn = new SqlConnection(DB.ConnString)) { return conn.Query<bool>("SELECT IsIt FROM SomeTable"); } } public async Task<bool> IsItAsync() { using (var conn = new SqlConnection(DB.ConnString)) { return await conn.QueryAsync<bool>("SELECT IsIt FROM SomeTable"); } } } 这些方法的异步和同步逻辑在各个方面都相同,除了一个是异步的,而另一个不是。在这种情况下,是否有合法的方法避免违反DRY原则?我看到有人说您可以在异步方法上使用GetAwaiter()。GetResult()并从您的sync方法中调用它?在所有情况下该线程都安全吗?还有其他更好的方法可以做到这一点,还是我不得不重复逻辑?
15 c#  .net  asynchronous 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.