Tag: async await

使用ContinueWith或Async-Await时的不同行为

当我在HttpClient调用中使用async-await方法(如下例所示)时,此代码会导致死锁 。 用t.ContinueWith替换async-await方法,它可以正常工作。 为什么? public class MyFilter: ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var user = _authService.GetUserAsync(username).Result; } } public class AuthService: IAuthService { public async Task GetUserAsync (string username) { var jsonUsr = await _httpClientWrp.GetStringAsync(url).ConfigureAwait(false); return await JsonConvert.DeserializeObjectAsync(jsonUsr); } } 这有效: public class HttpClientWrapper : IHttpClient { public Task GetStringAsync(string url) { […]

async /等待不同的线程ID

我最近正在阅读关于异步/等待的事情,我很惊讶我正在阅读的许多文章/post说明在使用异步等待时没有创建新线程( 示例 )。 我创建了一个简单的控制台应用程序来测试它 class Program { static void Main(string[] args) { Console.WriteLine(“Main: ” + Thread.CurrentThread.ManagedThreadId); MainAsync(args).Wait(); Console.WriteLine(“Main End: ” + Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task MainAsync(string[] args) { Console.WriteLine(“Main Async: ” + Thread.CurrentThread.ManagedThreadId); await thisIsAsync(); } private static async Task thisIsAsync() { Console.WriteLine(“thisIsAsyncStart: ” + Thread.CurrentThread.ManagedThreadId); await Task.Delay(1); Console.WriteLine(“thisIsAsyncEnd: ” + Thread.CurrentThread.ManagedThreadId); } […]

nunit如何成功等待async void方法完成?

在C#中使用async/await时,一般规则是避免async void因为它几乎是火,忘了,如果没有从方法发送返回值,则应该使用Task 。 说得通。 但奇怪的是,在本周早些时候,我正在为我编写的一些async方法编写一些unit testing,并注意到NUnit建议将async测试标记为void或返回Task 。 然后我试了一下,果然,它奏效了。 这看起来很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成? 如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void它怎么能把它拉下来呢? 所以我破解了源代码并找到了它。 我可以在一个小样本中重现它,但我根本无法理解它们正在做什么。 我想我对SynchronizationContext以及它是如何工作的了解不够。 这是代码: class Program { static void Main(string[] args) { RunVoidAsyncAndWait(); Console.WriteLine(“Press any key to continue. . .”); Console.ReadKey(true); } private static void RunVoidAsyncAndWait() { var previousContext = SynchronizationContext.Current; var currentContext = new AsyncSynchronizationContext(); SynchronizationContext.SetSynchronizationContext(currentContext); try { var myClass = new MyClass(); var […]

在C#Async CTP中`等待’线程会发生什么?

我一直在阅读关于新的async await关键字,它听起来很棒,但有一个关键问题我在目前为止看过的任何一个介绍video中都找不到答案(我也读过白皮书一会儿)。 假设我在主UI线程上的嵌套函数中调用了await 。 此时线程会发生什么? 控件是否返回消息循环,UI线程可以自由处理其他输入? 当等待的任务完成时,整个堆栈是否被推送到消息队列,这样控制将通过每个嵌套函数返回,或者是否还有其他完全发生的事情? 其次(虽然我引起了你的注意),我真的不明白为什么异步方法需要用async标记。 不能异步执行任何方法吗? 如果我想异步执行一个方法但它没有async关键字怎么办?有没有办法简单地做到这一点? 干杯。 🙂 编辑:不可否认,如果我能得到示例代码编译,我可能只是想出自己,但出于某种原因,我遇到了一个块。 我真正想知道的是,延续的持续程度是多久…是否冻结整个调用堆栈,在任务完成时恢复它,还是只返回到目前为止? 函数本身是否需要标记为异步以支持延续,或者(正如我最初所说的那样)是否继续整个调用堆栈? 如果它没有冻结整个调用堆栈,当异步等待命中非异步调用函数时会发生什么? 它阻止了吗? 难道这不会等待等待吗? 我希望你能看到我在这里缺少一些理解我希望有人可以填写,所以我可以继续学习这个。

操作完成前MVC4 + async / await +返回响应

在我的MVC4应用程序中,我需要添加一个控制器来上传和处理大文件。 文件上传后,我需要立即启动该文件的异步处理并将响应返回给浏览器,而无需等待处理完成。 显然我可以手动启动一个新线程来处理文件,但是我想知道我是否可以使用.net 4.5引入的async / await机制来实现这个场景 为了测试这个概念,我尝试过这样的事情: public async Task Test() { TestAsync(); return View(“Test”); } public async void TestAsync() { await LongRunning(); } private Task LongRunning() { return Task.Factory.StartNew(() => Pause()); } private int Pause() { Thread.Sleep(10000); return 3; } 异步机制似乎一般工作:当我调试代码时,我点击“返回视图(”测试“);” 行“返回3”之前的行。 但是,浏览器仅在Pause方法完成后才会收到响应。 这看起来像常规异步控制器(具有Async和Completed方法的控制器)。 有没有办法在控制器中为我的场景使用async / await?

如何在执行Task.WhenAny时产生返回项

我的解决方案中有两个项目:WPF项目和类库。 在我的class级图书馆: 我有一个符号列表: class Symbol { Identifier Identifier {get;set;} List HistoricalQuotes {get;set;} List HistoricalFinancials {get;set;} } 对于每个符号,我查询金融服务,以使用webrequest检索每个符号的历史财务数据。 (webClient.DownloadStringTaskAsync(URI)) 所以这是我的方法: public async Task<IEnumerable> GetSymbolsAsync() { var historicalFinancialTask = new List<Task>(); foreach (var symbol in await _listSymbols) { historicalFinancialTask.Add(GetFinancialsQueryAsync(symbol)); } while (historicalFinancialTask.Count > 0) { var historicalFinancial = await Task.WhenAny(historicalFinancialTask); historicalFinancialTask.Remove(historicalFinancial); // the line below doesn’t compile, […]

.net 4.5中的异步和同步之间的区别

在我阅读.Net 4.5 async异步编程和await关键字时,我在这里阅读以下段落 处理异步请求 在启动时看到大量并发请求或具有突发性负载(并发性突然增加)的Web应用程序中,使这些Web服务调用异步将提高应用程序的响应能力。 异步请求与同步请求相同的处理时间。 例如,如果请求进行需要两秒钟完成的Web服务调用,则无论是同步执行还是异步执行,请求都需要两秒钟 。 但是,在异步调用期间,在等待第一个请求完成时,不阻止线程响应其他请求。 因此,当有许多并发请求调用长时间运行的操作时,异步请求会阻止请求排队和线程池增长。 对于粗体字,我无法理解它们异步请求如何处理同步请求需要相同的时间? 例如: public async Task MyMethod() { Task longRunningTask = LongRunningOperation(); //indeed you can do independent to the int result work here //and now we call await on the task int result = await longRunningTask; //use the result Console.WriteLine(result); } public async Task LongRunningOperation() // […]

具有支持multithreading的限制的异步任务的队列

我需要实现一个库来请求vk.com API。 问题是API每秒只支持3个请求。 我想让API异步。 重要提示: API应支持从多个线程安全访问。 我的想法是实现一些名为throttler的类,它允许不超过3个请求/秒并延迟其他请求。 接口是下一个: public interface IThrottler : IDisposable { Task Throttle(Func<Task> task); } 用法就像 var audio = await throttler.Throttle(() => api.MyAudio()); var messages = await throttler.Throttle(() => api.ReadMessages()); var audioLyrics = await throttler.Throttle(() => api.AudioLyrics(audioId)); /// Here should be delay because 3 requests executed var photo = await throttler.Throttle(() => […]

使用async / await模式在C#5中编写高度可伸缩的TCP / IP服务器?

我的任务是设计一个相当简单的TCP / IP服务器,它必须接受来自多个客户端的连接。 它需要用C#编写,我使用的是.NET 4.5。 也就是说,我不确定.NET 4.5中TCP / IP服务器/客户端可扩展性的当前“最先进”是什么。 我确实看到了这篇文章: 如何编写可扩展的基于Tcp / Ip的服务器 。 但这与.NET 2.0和3.5有关,并没有提到async / await模式。 我能够用“旧方式”编写服务器……但我想知道“新方式”是什么。 在Socket,TcpClient或TcpListener上使用新的Async方法在C#中创建可伸缩服务器的最佳方法是什么? 新的Async方法是否利用I / O完成端口? 滚动自己的Socket监听器是否更有效,或者TcpListener / TcpClient类现在相当不错? 编辑:其他问题。

如何等待QueryCompleted事件?

我创建了一个小测试应用程序来获取经度和纬度并将其转换为实际地址: using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Device.Location; using System.Linq; using System.Net; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Maps.Services; using Microsoft.Phone.Shell; using PhoneApp1.Resources; using Windows.Devices.Geolocation; namespace PhoneApp1 { public partial class MainPage : PhoneApplicationPage { private GeoCoordinate Location; public ObservableCollection Addresses { get; set; } […]