Tag: async await

ASP.NET MVC中的HttpClient Singleton实现

在www.asp.net上阅读此博客文章和官方说明后 : HttpClient旨在实例化一次,并在应用程序的整个生命周期中重复使用。 特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重负载下可用的套接字数量。 这将导致SocketException错误。 我发现我们的代码在每次调用时都处理了HttpClient。 我正在更新我们的代码,以便我们重用HttClient,但我关心的是我们的工具但不是线程安全的。 以下是新代码的当前草案: 对于unit testing,我们为HttpClient实现了一个包装器,消费者调用包装器: public class HttpClientWrapper : IHttpClient { private readonly HttpClient _client; public Uri BaseAddress { get { return _client.BaseAddress; } set { _client.BaseAddress = value; } } public HttpRequestHeaders DefaultRequestHeaders { get { return _client.DefaultRequestHeaders; } } public HttpClientWrapper() { _client = new HttpClient(); } public […]

如何复制HttpContent async和cancelable?

我正在使用HttpClient.PostAsync() ,响应是一个HttpResponseMessage 。 它的Content属性是HttpContent类型,它有一个CopyToAsync()方法。 不幸的是,这是不可取消的。 有没有办法将响应复制到Stream并传递CancellationToken ? 我没有CopyToAsync() ! 如果有解决方法,那就没问题了。 就像读取几个字节一样,检查是否取消,继续阅读等等。 HttpContent.CreateContentReadStreamAsync()方法看起来像是一个候选者。 很遗憾,我选择的个人资料无法使用此function。 还不清楚它是否会一次性读取所有数据并浪费大量内存。 注意:我在PCL中使用这个,目标是WP8,Windows Store 8,.NET 4.5,Xamarin.iOS和Xamarin.Android

如何从非异步方法调用异步方法?

我有以下方法: public string RetrieveHolidayDatesFromSource() { var result = this.RetrieveHolidayDatesFromSourceAsync(); /** Do stuff **/ var returnedResult = this.TransformResults(result.Result); /** Where result gets used **/ return returnedResult; } private async Task RetrieveHolidayDatesFromSourceAsync() { using (var httpClient = new HttpClient()) { var json = await httpClient.GetStringAsync(SourceURI); return json; } } 以上不起作用,似乎没有正确返回任何结果。 我不知道我在哪里错过强制等待结果的陈述? 我希望RetrieveHolidayDatesFromSource()方法返回一个字符串。 以下工作正常,但它是同步的,我相信它可以改进吗? 请注意,下面是同步的,我想将其更改为异步,但由于某种原因无法解决问题。 public string RetrieveHolidayDatesFromSource() […]

从异步中捕获未处理的exception

当等待的async方法抛出exception时,exception存储在某处并且抛出它会被延迟。 在WinForms或WPF应用程序中,它使用SynchronizationContext.Current来发布exception的抛出。 但是,在例如控制台应用程序中,它会在线程池上抛出exception并关闭应用程序。 如何防止async方法抛出的exception导致应用程序崩溃? 编辑: 显然,我所描述的问题是因为我有void async方法。 看评论。

调用线程无法访问此对象,因为另一个线程拥有它(async / await / task)

我正在使用async / await等将一些长时间运行的代码移动到后台,但是遇到了主题行错误。 我很清楚我无法从任务更新我的WPF UI控件(我已经适当地添加了调度程序)但是这个错误只是更新了我的类中的对象。 例: private WriteableBitmap TempImage; public async void StartProcessing() { WriteableBitmap LoadedImage = new WriteableBitmap(await LoadImage(0)); //ERROR HERE LoadedImage.Freeze(); TempImage = LoadedImage; // do more stuff } private Task LoadImage(int imageIndex) { return Task.Run(() => { FileStream fileStream = new FileStream(fileList[0], FileMode.Open, FileAccess.Read); var img = new BitmapImage(); img.BeginInit(); img.StreamSource = […]

在Windows Phone 8中下载并保存文件Async

如何异步下载文件并将文件保存到IsolatedStorage ? 我首先使用WebClient作为目的,但我无法等到完成,所以我在这里找到了一些有用的代码。 但是,这也不是完整的格式。 我发现了这个function: public static Task DownloadFile(Uri url) { var tcs = new TaskCompletionSource(); var wc = new WebClient(); wc.OpenReadCompleted += (s, e) => { if (e.Error != null) tcs.TrySetException(e.Error); else if (e.Cancelled) tcs.TrySetCanceled(); else tcs.TrySetResult(e.Result); }; wc.OpenReadAsync(url); return tcs.Task; } 但是如何将此文件保存到IsolatedStorage ? 有人帮我完成这个function!

为什么WebClient.DownloadStringTaskAsync()会阻塞? – 新的异步API /语法/ CTP

出于某种原因,在下面的程序启动后会暂停。 我相信WebClient().DownloadStringTaskAsync()是原因。 class Program { static void Main(string[] args) { AsyncReturnTask(); for (int i = 0; i < 15; i++) { Console.WriteLine(i); Thread.Sleep(100); } } public static async void AsyncReturnTask() { var result = await DownloadAndReturnTaskStringAsync(); Console.WriteLine(result); } private static async Task DownloadAndReturnTaskStringAsync() { return await new WebClient().DownloadStringTaskAsync(new Uri(“http://www.weather.gov”)); } } 据我所知,我的程序应该立即从0到15开始计数。 难道我做错了什么? 我在原始的Netflix下载示例(使用CTP获得)时遇到了同样的问题 – […]

从SignalR中心发送异步邮件

我需要通过SignalR集线器调用发送电子邮件。 我不希望send同步执行,因为我不想绑定WebSocket连接,但是如果可能的话,我希望通知调用者是否有任何错误。 我以为我可以在集线器中使用这样的东西(减去error handling和我希望它做的所有其他事情): public class MyHub : Hub { public async Task DoSomething() { var client = new SmtpClient(); var message = new MailMessage(/* setup message here */); await client.SendMailAsync(message); } } 但很快发现它不起作用; client.SendMailAsync调用抛出这个: System.InvalidOperationException:此时无法启动异步操作。 异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。 进一步的调查和阅读表明,SmtpClient.SendMailAsync是围绕EAP方法的TAP包装器,而SignalR不允许这样做。 我的问题是,有没有简单的方法直接从集线器方法发送电子邮件? 或者我唯一的选择是将电子邮件发送到其他地方? (例如,让集线器队列成为服务总线消息,然后一个独立的服务可以处理这些消息并发送电子邮件[虽然我也有更多的工作来实现将结果通知回集线器的客户端];或者让集线器向发送电子邮件的Web服务发出HTTP请求。

什么是将任务包装为任务的最佳方法

我正在编写一些异步辅助方法,我有API来支持Task和Task 。 为了重用代码,我希望基于Task的API将给定任务包装为Task并且只需调用Task API。 我可以这样做的一种方法是: private static async Task Convert(this Task @this) { await @this.ConfigureAwait(false); return false; } 但是,我想知道:有没有更好/内置的方法来做到这一点?

如何将同步上下文添加到异步测试方法

我有Visual Studio 2012和需要同步上下文的异步测试。 但是MSTest的默认同步上下文为null。 我想测试在具有同步上下文的WPF或WinForms-UI线程上运行。 将SynchronizationContext添加到测试线程的最佳方法是什么? [TestMethod] public async Task MyTest() { Assert.IsNotNull( SynchronizationContext.Current ); await MyTestAsync(); DoSomethingOnTheSameThread(); }