Tag: 异步

异步设计中的会话

我们正在构建一个支持AJAX的Web应用程序,它向服务器发出多个异步请求。 这些服务器请求中的每一个都是长时间运行的服务器任务,每个服务器任务都将JSON对象返回到html页面。 这些调用中的每一个都需要对Session对象的读/写访问权限。 但是当多个异步任务正在进行时,ASP.NET会锁定会话对象,从而阻止第一个异步调用。 所以这些异步调用永远不会并行发生。 PS:异步调用是PageMethod调用。 当使用并行异步调用时,首先不建议使用会话。 有关设计此异步请求模型的任何其他建议将受到高度赞赏。

任务和异步之间的区别

C#提供了两种创建异步方法的方法: 方法1: static Task MyAsyncTPL() { Task result = PerformWork(); return result.ContinueWith(t => MyContinuation()); } 方法2: static async Task MyAsync() { string result = await PerformWork(); return MyContinuation(); } 上述两种方法都是异步的并且实现了同样的目的。 那么,我什么时候应该选择一种方法呢? 是否有使用其中一个的指导方针或优点?

如何在lambda表达式中捕获外部变量的值?

我刚刚遇到以下行为: for (var i = 0; i { Debug.Print(“Error: ” + i.ToString()); }); } 将导致一系列“错误:x”,其中大多数x等于50。 同理: var a = “Before”; var task = new Task(() => Debug.Print(“Using value: ” + a)); a = “After”; task.Start(); 将导致“使用价值:之后”。 这显然意味着lambda表达式中的串联不会立即发生。 在声明表达式时,如何在lambda表达式中使用外部变量的副本? 以下内容不会更好(我承认这不一定是不连贯的): var a = “Before”; var task = new Task(() => { var a2 = a; Debug.Print(“Using […]

Dns.BeginGetHost …方法阻塞

所以我想做很多 DNS查询。 我从Begin/EndGetHostEntry异步对创建(数千个)任务: var lookupTask = Task.Factory.FromAsync ( Dns.BeginGetHostEntry, (Func) Dns.EndGetHostEntry, “google.com”, null ) 然后Task.WaitAll完成所有事情。 我看到ThreadPool线程的数量急剧增加以响应我的请求。 如果我将ThreadPool minThreads为500,则工作量的消耗会大大加快。 所有这些都指向Dns异步实现中的阻塞。 如果我用管理的Dns客户端替换Dns ,我可以使用相同的工作负载,在ThreadPool只有1或2个线程,而cpu几乎是空闲的。 问题是, Dns实现绝对是许多网络API( HttpWebRequest , WebClient , HttpClient )的核心,它们似乎都受到这个问题的影响。 如果我使用第三方库解析DNS,并使用IP地址作为uri中的主机发出HTTP请求,然后更改Host标头以修复请求,与涉及System.Net.Dns任何内容相比,我都会获得极高的性能。 这里发生了什么? 我错过了什么或者System.Net.Dns实现真的那么糟糕吗?

可以从多个线程等待相同的任务 – 等待线程安全吗?

等待线程安全吗? 似乎Task类是线程安全的,所以我猜等待它也是线程安全的,但我还没有在任何地方找到确认。 线程安全也是定制awaiter的要求 – 我的意思是IsCompleted,GetAwaiter等方法? 即如果这些方法不是线程安全的,那么等待是否是线程安全的? 但是,我不希望很快就需要定制的等待者。 用户场景的一个示例:假设我有一个后台任务,它以异步方式返回结果,然后从多个线程使用: using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace scratch1 { class Foo { Task _task; public Foo() { _task = Task.Run(async () => { await Task.Delay(5000); return 5; }); } // Called from multiple threads public async Task Bar(int i) { return (await _task) + i; […]

在冷IObservable上暂停和恢复订阅

使用Rx ,我希望在以下代码中暂停和恢复function: 如何实现Pause()和Resume()? static IDisposable _subscription; static void Main(string[] args) { Subscribe(); Thread.Sleep(500); // Second value should not be shown after two seconds: Pause(); Thread.Sleep(5000); // Continue and show second value and beyond now: Resume(); } static void Subscribe() { var list = new List { 1, 2, 3, 4, 5 }; var obs = […]

BeginConnect和ConnectAsync有什么区别?

BeginConnect和ConnectAsync什么区别? 随后, BeginDisconnect和DisconnectAsync什么区别? ConnectAsync文档指出: “开始远程主机连接的异步请求。” BeginConnect文档还指出: “开始远程主机连接的异步请求。” DisconnectAsync和BeginDisconnect表示同样的事情: “开始异步请求以断开与远程端点的连接。” 这些方法对与应该使用哪种方法之间的区别是什么?

为什么尝试/最终而不是“使用”语句有助于避免竞争条件?

此问题涉及另一个post中的评论: 取消entity framework查询 为清楚起见,我将从那里重现代码示例: var thread = new Thread((param) => { var currentString = param as string; if (currentString == null) { // TODO OMG exception throw new Exception(); } AdventureWorks2008R2Entities entities = null; try // Don’t use using because it can cause race condition { entities = new AdventureWorks2008R2Entities(); ObjectQuery query = entities.People .Include(“Password”) […]

在没有等待#2的情况下调用异步方法

我有一个异步方法: public async Task ValidateRequestAsync(string userName, string password) { using (HttpClient client = new HttpClient()) { HttpResponseMessage response = await client.GetAsync(url); string stringResponse = await response.Content.ReadAsStringAsync(); return bool.Parse(stringResponse); } } 我这样称呼这个方法: bool isValid = await ValidateRequestAsync(“user1”, “pass1”); 我可以使用同步方法调用相同的方法,而不使用await关键字吗? 例如: public bool ValidateRequest(string userName, string password) { return ValidateRequestAsync(userName, password).Result; } 我认为这会导致僵局。 编辑 调用上面的方法会使调用永远不会结束。 (该方法不再到达终点)

什么线程在`await`关键字后运行代码?

我先发一个简单的例子: private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await } 假设我在单线程应用程序中运行上述代码,就像控制台应用程序一样。 我很难理解代码//Code after await的代码是如何运行的。 据我所知,当我在MyAsyncMethod()控件中点击await关键字时,会返回到MyMethod() ,但后来我用task.Wait()锁定了该线程。 如果线程被锁定,那么如果应该接受它的线程被锁定,那么//Code after await运行//Code after await怎么办? 是否创建了一个新线程来//Code after await ? 或者主线程是否神奇地走出task.Wait()运行//Code after await ? 我不确定这是怎么回事?